云顶集团400800044

当前位置:云顶集团400800044 > 云顶集团400800044 > 云顶集团400800044:原生对象及扩展,JS宗旨种类

云顶集团400800044:原生对象及扩展,JS宗旨种类

来源:http://www.ofertasanjuan.com 作者:云顶集团400800044 时间:2019-10-06 21:43

知情JavaScript的原型属性

2016/06/21 · JavaScript · 2 评论 · 原型

本文由 伯乐在线 - alvendarthy 翻译,sunshinebuel 校稿。未经许可,禁绝转发!
匈牙利语出处:bytearcher。应接插手翻译组。

理解 JavaScript 的prototype品质不太轻便。你恐怕知道它同面向对象编制程序(OOP)和对象承接有关,但不至于对其工夫原理非常通晓。

你不可不知的 HTML 优化技巧

2016/09/12 · 基础本事 · 2 评论 · HTML

本文作者: 伯乐在线 - 草龙珠城控件 。未经作者许可,禁绝转发!
招待参加伯乐在线 专栏撰稿人。

哪些升高Web页面包车型客车质量,很多开荒职员从多个位置来入手如JavaScript、图像优化、服务器配置,文件收缩或是调治CSS。

很精通HTML 已经完毕了多个瓶颈,固然它是付出Web 分界面必备的主导语言。HTML页面包车型客车载重也是越来越重。大好些个页面平均供给40K的半空中,像有个别大型网址会满含数以千计的HTML 成分,页面Size会更加大。

哪些有效的低沉HTML 代码的复杂度和页面成分的数据,本文重要消除了那几个难点,从八个地点介绍了怎么着编写简练,清晰的HTML 代码,能够使得页面加载更为急速,且能在二种设备中运转卓越。

JavaScript 原生对象及增添

2016/09/26 · JavaScript · 对象

原稿出处: trigkit4   

闲话响应式图片

2016/11/14 · HTML5 · 5 评论 · HTML5, 响应式图片

正文笔者: 伯乐在线 - TGCode 。未经笔者许可,制止转发!
迎接参预伯乐在线 专辑撰稿人。

“响应式(Responsive)”这一个词小编想大家未有听过1000遍,也可以有玖拾陆回了。响应式是指完成分裂显示器分辨率的极端上浏览网页的例外突显格局。网络介绍响应式的文章也可以有数不完了,举例:《自适应页面设计》。在那篇文章中,大家不讲页面布局的响应式,大家任重(英文名:rèn zhòng)而道远来拜候“响应式图片”。
那篇小说主要内容:

  • 干什么要利用响应式图片
  • <picture>元素
  • img的srcset、sizes属性

1、为何要运用响应式图片

假诺有一张图片的来得上涨的幅度为200px,那么,它在 1x(即设备像素比为 1 的显示屏) 的显示器上,是占了 200 个大要像素(即事实上所占的像素);它在2x 的显示屏上,实际上是占了 400 个轮廓像素;在 3x 的显示器上,实际上是占了 600 个大意像素;在 4x 的显示器上正是占了 800 个大要像素。

比如这些图片只提供 200 像素的尺码,那么在 2x~4x 的显示屏上看起来就很模糊。要是只提供 800 像素的版本,那么在 1x~3x 的设备上会显得多余,因为加载时间会相较长,所以大家要选取响应式图片。

我们有二种办法来安装响应式图片:

  • 使用<picture>元素(HTML5新增)
  • 使用img的srcset、sizes

2、picture元素

在HTML 5中,扩充了多个新因素<picture>。用过<video>、<audio>的,会感到<picture>的用法很熟练:

<picture>   <source srcset="smaller.jpg" media="(max-width: 750px)">   <source srcset="default.jpg">   <img srcset="default.jpg" /> </picture>

1
2
3
4
5
6
7
8
9
<picture>
 
  <source srcset="smaller.jpg" media="(max-width: 750px)">
 
  <source srcset="default.jpg">
 
  <img srcset="default.jpg" />
 
</picture>

云顶集团400800044, 

不理解你放在心上到未有,在 media 属性使用的语法与CSS媒体(media)特性中利用的语法一样。你能够选取一样的性状,也便是说你能够查询 max-width , min-width , max-height , min-height , orientation 等品质。

观望<picture>那么些成分是或不是很提神,可是不得不提示你一句,前段时间以来,那一个成分依旧有包容性难点的。

兼容性:兼容性

理之当然,要是您早晚要运用<picture>那一个因素,又要在别的浏览器里援救,那您就供给增添三个附加的插件:Picturefill2.0

<script src="picturefill.js"></script>

1
<script src="picturefill.js"></script>

虽说<picture>很平价,但假如你着想到宽容性,依旧要郁郁寡欢运用,可是,大家也可能有包容性较好的别的一种管理响应式图片的措施,看上边。

3、img的srcset、sizes属性

当然,<img>成分本身也提供了响应式的性质:srcsetsizes

3.1 旧版本的srcset属性

在原先,我们是如此用的:

<img src="width-128px.jpg" srcset="width-128px.jpg 1x, width-256px.jpg 2x" />

1
<img src="width-128px.jpg" srcset="width-128px.jpg 1x, width-256px.jpg 2x" />

这段代码什么意思呢?

浏览器依据屏幕差异的像素密度(x)来展现对应尺寸的图样,也足以说是基于设备的像素比来呈现不相同的图片。

看图:

云顶集团400800044 1

云顶集团400800044 2

别老是望着“外人的大嫂”,请小心灰色箭头,DP讴歌ZDX便是设备像素比,差异的像素比,博览会示差别的图纸。

脚下荧屏密度有:1x、2x、3x、4x。

3.2 新专门的学问的srcset、sizes属性,w描述符

旧版本的srcset使用多少有个别局限性,可是幸亏的是到二零一四年,大家早就有了全新的srcset,并且还多二个size是性质。

动用新的srcset,大家只必要提供图片能源以及断点,浏览器会去自动相称最棒突显图片。

利用方法如下:

<img src="width-128.jpg" srcset="width-128.jpg 128w, width-512.jpg 512w" sizes="(max-width: 500px) 128px, 512px" />

1
<img src="width-128.jpg" srcset="width-128.jpg 128w, width-512.jpg 512w" sizes="(max-width: 500px) 128px, 512px" />

地方这段代码的意趣表示:不匡助srcset属性时,使用src中的图片,不然浏览器会自行相称最棒显示图片;sizes质量的值表示当可视区宽度不高于500像素,则图片宽度展现为128px,别的情状下,图片宽度展现为512px。。

云顶集团400800044 3

云顶集团400800044 4

小心:假诺您用pc浏览器测量试验这段代码,一定要先步入移动方式,因为一张开页面时可视区大于500px(除非您的计算机是Mini版),会先出示大图片,随后就算你收缩显示器,小图片即使会加载,你能够在调整台的“Network”里阅览,不过来得的依然会是大图片,因为后面大图片已经缓存了,而浏览器会自动相称最棒展现的图纸。

srcset用来提供图片财富,sizes属性的效果类似媒体询问,用来安装图片尺寸的临界点。

sizes="[media query] [length], [media query] [length]..."

1
sizes="[media query] [length], [media query] [length]..."

要保管使用sizes 里总结出来的幅度始终是图片所占显示器宽度(length)。

何以说sizes质量的功用类似媒体询问呢?

因为它只是永葆部分媒体询问,比如:

(min-width: 400px) (not (orientation: landscape) ) ( (orientation: landscape) and (min-width:400px) ) ( (orientation: portrait) or (max-width: 500px) )

1
2
3
4
5
6
7
(min-width: 400px)
 
(not (orientation: landscape) )
 
( (orientation: landscape) and (min-width:400px) )
 
( (orientation: portrait) or (max-width: 500px) )

 

但它不帮衬大家一览无遗的概念媒体类型:譬如screen或然print等等。

除去运用px外,大家还足以动用em、px、cm、vw…,以致CSS3的calc,不可能运用比例。

sizes=”(max-width: 320px) calc(100vw – 20px), 128px”

表示当视区上涨的幅度不高于320像素时候,图片宽度为一体视区宽度减去20像素的大小。

宽容性查看:兼容性

3.3 常见的应用情状

(1)要是图片的幅度是一切视口的比重,那么sizes能够这么设置:

sizes="80vw"

1
sizes="80vw"

(2)若是图片两边的边距各为10px,大家能够这么设置:

sizes="calc( 100vw - 20px)"

1
sizes="calc( 100vw - 20px)"

(3)若是有一个两边边距为10px的图形,允许它的最大开间为500px,大家得以那样设置:

sizes="( min-width:520px) 500px, calc(100vw - 20px)"

1
sizes="( min-width:520px) 500px, calc(100vw - 20px)"

地点的代码表示当可视区大于520px时,图片宽度为500px,不然宽度为calc(100vw – 20px)总计的值。

打赏帮助笔者写出越来越多好小说,谢谢!

打赏笔者

JS大旨连串:浅谈 原型对象和原型链

2016/03/01 · JavaScript · 2 评论 · 原型对象, 原型链

原稿出处: 一像素   

在Javascript中,万物皆对象,但目的也可能有分别,大致能够分为两类,即:普通对象(Object)和函数对象(Function)。

貌似来讲,通过new Function产生的指标是函数对象,别的对象都以普普通通对象。

比方表达:

function f1(){ //todo } var f2 = function(){ //todo }; var f3 = new Function('x','console.log(x)'); var o1 = {}; var o2 = new Object(); var o3 = new f1(); console.log( typeof f1,//function typeof f2,//function typeof f3,//function typeof o1,//object typeof o2,//object typeof o3 //object ); >> function function function object object object

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function f1(){
    //todo
}
var f2 = function(){
    //todo
};
var f3 = new Function('x','console.log(x)');
 
var o1 = {};
var o2 = new Object();
var o3 = new f1();
 
console.log(
    typeof f1,//function
    typeof f2,//function
    typeof f3,//function
    typeof o1,//object
    typeof o2,//object
    typeof o3 //object
);
>> function function function object object object

f1属于函数的扬言,最分布的函数定义形式,f2实际上是多少个无名氏函数,把那个无名氏函数赋值给了f2,属于函数表明式,f3不普及,但也是一种函数对象。

Function是JS自带的对象,f1,f2在创建的时候,JS会自动通过new Function()的不二等秘书籍来营造那一个目的,由此,那四个对象都以因此new Function()成立的。

在Javascript中创设对象有两种方式:对象字面量和平运动用new表明式,o1和o2的创导恰好对应了那二种办法,着重讲一下o3, 假诺用Java和C#的思绪来精通的话,o3是f1的实例对象,o3和f1是同样档案的次序,最少自身以前这么认为,并非如此…

那就是说怎么驾驭啊? 异常粗略,看o3是否经过new Function发生的, 显著不是,既然不是函数对象,那正是不以为奇对象 。

经过对函数对象和一般性对象的简要领悟之后,咱们再来驾驭一下Javascript中的原型和原型链:

在JS中,每当制造一个函数对象f1 时,该指标中都会放到一些性质,其中满含prototype和__proto__,  prototype即原型对象,它记录着f1的部分性质和方法。

内需专一的是,prototype 对f1是不可见的,也正是说,f1不会寻觅prototype中的属性和格局。

function f(){} f.prototype.foo = "abc"; console.log(f.foo); //undefined

1
2
3
function f(){}
f.prototype.foo = "abc";
console.log(f.foo); //undefined

那就是说,prototype有怎么着用呢? 其实prototype的第一成效正是持续。 通俗一点讲,prototype中定义的性格和形式都以留给自身的“后代”用的,由此,子类完全能够访问prototype中的属性和办法。

想要知道f1是什么样把prototype留给“后代”,大家必要领会一下JS中的原型链,此时,JS中的 __proto__ 进场了,这汉子长的很新奇,隐蔽的也很深,以至于你时常见不到它,但它在平时对象和函数对象中都设有, 它的成效正是保存父类的prototype对象,JS在经过new 表明式成立三个对象的时候,平日会把父类的prototype赋值给新目的的__proto__质量,那样,就造成了一代代承接…

function f(){} f.prototype.foo = "abc"; var obj = new f(); console.log(obj.foo); //abc

1
2
3
4
function f(){}
f.prototype.foo = "abc";
var obj = new f();
console.log(obj.foo); //abc

现行反革命大家知晓,obj中__proto__封存的是f的prototype, 那么f的prototype中的__proto__中保存的是何许吗? 看下图:

云顶集团400800044 5

如图所示,f.prototype的__proto__中保存的是Object.prototype,Object.prototype对象中也许有__proto__,而从出口结果看,Object.prototype.__proto__ 是null,表示obj对象原型链的利落。如下图所示:

云顶集团400800044 6

obj对象具有那样八个原型链未来,当obj.foo试行时,obj会先找找本人是不是有该属性,但不会搜索本人的prototype,当找不到foo时,obj就本着原型链依次去查找…

在上边的例子中,大家在f的prototype上定义了foo属性,那时obj就能在原型链上找到那特性格并实践。

 

终极,用几句话总括一下本文中涉嫌到的关键:

  1. 原型链的多变真就是靠__proto__ 而非prototype,当JS引擎实施对象的议程时,先找找对象自己是不是存在该措施,假设子虚乌有,会在原型链上查找,但不会招来本人的prototype。
  2. 四个对象的__proto__记录着团结的原型链,决定了自己的数据类型,改变__proto__就相当于更换目的的数据类型。
  3. 函数的prototype不属于小编的原型链,它是子类创制的基本,决定了子类的数据类型,是三翻五次子类原型链的桥梁。
  4. 在原型对象上定义方法和属性的目标是为了被子类继承和平运动用。

 

2 赞 17 收藏 2 评论

云顶集团400800044 7

原型承继

面向对象编制程序能够透过广大门道完结。其他的言语,比如Java,使用基于类的模型完成: 类及对象实例区别对待。但在 JavaScript 中平素不类的定义,替代它的是成套皆对象。JavaScript 中的承继通过原型承袭实现:叁个指标直接从另一对象传承。对象中满含其继续类别中祖先的引用——对象的 prototype 属性。

class 关键字是在 ES6 中第二次引进 JavaScript 的。其实,它并未为面向对象承接引进新模型, class 关键字通过语法糖,完结了本文介绍的原型脾性和构造函数。

在统一准备和开销进度中须要根据以下原则:

  • 组织分离:使用HTML 扩充结构,实际不是样式内容;
  • 维持整洁:为办事流增添代码验证工具;使用工具或样式向导维护代码结交涉格式
  • 读书新语言:获取成分结交涉语义标识。
  • 确定保证可访谈: 使用A大切诺基IA 属性和Fallback 属性等
  • 测验: 使网址在三种配备中能够完美运营,可选用emulators和质量工具。

云顶集团400800044 8

停放对象与原生对象

内置(Build-in)对象与原生(Naitve)对象的不相同在于:前面一个总是在汽油发动机发轫化阶段就被创设好的靶子,是后世的贰个子集;而后面一个满含了一部分在运营进度中动态成立的目的。

云顶集团400800044 9

打赏帮助作者写出愈来愈多好小说,感激!

任选一种支付办法

云顶集团400800044 10 云顶集团400800044 11

2 赞 14 收藏 5 评论

JavaScript 达成三番五次的语言特色

以下语言特色共同落成了 JavaScript 承接。

  • 当尝试访问 JavaScript 对象中子虚乌有的品质时,深入分析器会查找相称的指标原型。例如调用 car.toString(),如果 car 没有 toString 方法,就能够调用 car 对象的原型。 那些查找进程会平昔递归, 直到寻觅到卓越的原型大概承袭链尽头。
  • 调用  new Car() 会成立三个新的靶子,并初阶化为 Car.prototype。 这样就同意为新对象设置原型链。需求注意的是,new Car() 只有当  Car 是函数时才有含义。 此类函数即所谓构造函数。
  • 调用对象的多个成员函数时, this 的值被绑定为最近指标。比方调用 "abc".toString()this 的值棉被服装置为 "abc",然后调用 toString 函数。该技能帮助代码重用:一样的代码,可在 this 为种种分歧的值时调用。对象的积极分子函数,也被称之为对象的艺术。

HTML、CSS 和JavaScript三者的关联

HTML 是用来调度页面结构和剧情的标识语言。HTML 不可能用来修饰样式内容,也不能够在头标签中输入文本内容,使代码变得冗长和眼花缭乱,相反使用CSS 来修饰布局成分和外观相比较得当。HTML成分暗许的外观是由浏览器默许的样式表定义的,如在Chrome中h1标签成分会渲染成32px的Times 粗体。

三条通用设计准绳:

  1. 采纳HTML 来布局页面结构,CSS修饰页面显示,JavaScript达成页面效果。CSS ZenGarden 很好地展示了作为分开。
  2. 要是能用CSS或JavaScript完毕就少用HTML代码。
  3. 将CSS和JavaScript文件与HTML 分开贮存。那可有利于缓存和调节和测量检验。

原生对象(New后的目的)

ECMA-262 把原生对象(native object)定义为“独立于宿主情形的 ECMAScript 落成提供的靶子”。包含如下:

Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、UWranglerIError、ActiveXObject(服务器方面)、Enumerator(集结遍历类)、RegExp(正则表明式)

1
Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError、ActiveXObject(服务器方面)、Enumerator(集合遍历类)、RegExp(正则表达式)

透过能够见见,简来说之,原生对象便是 ECMA-262 定义的类(援引类型)。

来源:

有关我:TGCode

云顶集团400800044 12

路途虽远,无所畏 个人主页 · 笔者的小说 · 9 ·    

云顶集团400800044 13

举个栗子

咱俩用面向对象编制程序,达成四个乘除矩形周长的例子。

JavaScript

function Rectangle(x, y) { this.x = x; this.y = y; } Rectangle.prototype.perimeter = function() { return 2 * (this.x + this.y); } var rect = new Rectangle(1, 2); console.log(rect.perimeter()); // outputs '6'

1
2
3
4
5
6
7
8
9
10
11
function Rectangle(x, y) {
    this.x = x;
    this.y = y;
}
 
Rectangle.prototype.perimeter = function() {
    return 2 * (this.x + this.y);
}
 
var rect = new Rectangle(1, 2);
console.log(rect.perimeter()); // outputs '6'

第一,我们定义构造函数 Rectangle。 根据规范,大家大写构造函数名首字母,表明它能够用 new 调用,以示与别的常规函数的区别。构造函数自动将 this 赋值为一空对象,然后代码中用 xy 属性填充它,以备后用。

然后, Rectangle.prototype 新增添四个通过 xy 属性总结周长成员函数。 注意 this 的运用,在分化的指标中,this 会有两样的值,那几个代码都得以不奇怪干活。

终极, 两个名称叫 rect 的对象创制出来了。 它继续了 Rectangle.prototype, 大家得以调用 rect.perimeter(), 然后将结果打字与印刷到调整台。

文书档案结构方面也得以做优化,如下:

  • 选拔HTML5 文书档案类型,以下是空文件:

<!DOCTYPE html> <html> <head> <title>Recipes: pesto</title> </head> <body> <h1>Pesto</h1> <p>Pesto is good!</p> </body> </html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html>
 
<head>
<title>Recipes: pesto</title>
</head>
 
<body>
 
  <h1>Pesto</h1>
 
  <p>Pesto is good!</p>
 
</body>
</html>
  • 在文书档案起首位置援引CSS文件,如下:

<head> <title>My pesto recipe</title> <link rel="stylesheet" href="/css/global.css"> <link rel="stylesheet" href="css/local.css"> </head>

1
2
3
4
5
6
7
<head>
  <title>My pesto recipe</title>
 
  <link rel="stylesheet" href="/css/global.css">
  <link rel="stylesheet" href="css/local.css">
 
</head>

行使那三种办法,浏览器会在深入分析HTML代码在此之前将CSS音信图谋好。由此有辅助提高页面加载品质。

在页面尾巴部分body结束标签以前输入JavaScript代码,那样有利于进步页面加载的进程,因为浏览器在分析JavaScript代码在此之前将页面加载成功,使用JavaScript会对页面成分产生积极的熏陶。

<body> ... <script src="/js/global.js"> <script src="js/local.js"> </body>

1
2
3
4
5
6
7
8
<body>
 
  ...
 
  <script src="/js/global.js">
  <script src="js/local.js">
 
</body>

应用Defer和async属性,脚本成分具备async 属性无法保证会按顺序施行。

可在JavaScript代码中加多Handlers。千万别加到HTML内联代码中,举例上边包车型大巴代码则轻巧导致错误且不易于维护:

index.html:

<head> ... <script src="js/local.js"> </head> <body onload="init()"> ... <button onclick="handleFoo()">Foo</button> ... </body>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<head>
  
  ...
 
  <script src="js/local.js">
 
</head>
 
<body onload="init()">
 
  ...
 
  <button onclick="handleFoo()">Foo</button>
 
  ...
 
</body>

上边包车型客车写法比较好:

index.html:

<head> ... </head> <body> ... <button id="foo">Foo</button> ... <script src="js/local.js"> </body>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<head>
 
  ...
 
</head>
 
<body>
 
  ...
 
  <button id="foo">Foo</button>
 
  ...
 
  <script src="js/local.js">
 
</body>

js/local.js:

init(); var fooButton = document.querySelector('#foo'); fooButton.onclick = handleFoo();

1
2
3
4
init();
var fooButton =
    document.querySelector('#foo');
fooButton.onclick = handleFoo();

松开对象(没有需求New)

概念:由ECMAScript完毕提供的对象,独立于宿主情形,在多个剧本程序试行的起来处。

:每一种内置对象(built-in object)都以原生对象(Native Object),二个平放的构造函数是叁个平放的靶子,也是贰个构造函数。

来源:

云顶集团400800044:原生对象及扩展,JS宗旨种类。举个栗子:

Native objects: Object (constructor), Date, Math, parseInt, eval。 string 方法比方 indexOf 和 replace, array 方法, ... Host objects (假定是浏览器景况): window, document, location, history, XMLHttpRequest, set提姆eout, getElementsByTagName, querySelectorAll, ...

1
2
3
Native objects: Object (constructor), Date, Math, parseInt, eval。 string 方法比如 indexOf 和 replace, array 方法, ...
 
Host objects (假定是浏览器环境): window, document, location, history, XMLHttpRequest, setTimeout, getElementsByTagName, querySelectorAll, ...

ECMA-262][2 只定义了多少个新的放置对象,即 GlobalMath (它们也是原生对象,依据定义,每种内置对象都以原生对象)。

以下是ECMA-262概念的嵌入对象(built-in):

global、Object、Function、Array、String、Boolean、Number、Math、Date、RegExp、JSON、Error对象(Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError 和URIError)

1
global、Object、Function、Array、String、Boolean、Number、Math、Date、RegExp、JSON、Error对象(Error,   EvalError, RangeError, ReferenceError,   SyntaxError, TypeError 和URIError)

云顶集团400800044 14

大家也足以修改内置对象的原型

JavaScript

if (!Array.prototype.forEach) { Array.prototype.forEach = function(fn){ for ( var i = 0; i < this.length; i++ ) { fn( this[i], i, this ); } }; } ["a", "b", "c"].forEach(function(value, index, array){ assert( value, "Is in position " + index + " out of " + (array.length - 1) ); });

1
2
3
4
5
6
7
8
9
10
11
if (!Array.prototype.forEach) {
  Array.prototype.forEach = function(fn){
    for ( var i = 0; i < this.length; i++ ) {
      fn( this[i], i, this );
    }
  };
}
["a", "b", "c"].forEach(function(value, index, array){
  assert( value, "Is in position " + index + " out of " + (array.length - 1) );
});

如上代码将出口:

PASS Is in position 0 out of 2 PASS Is in position 1 out of 2 PASS Is in position 2 out of 2

1
2
3
PASS Is in position 0 out of 2
PASS Is in position 1 out of 2
PASS Is in position 2 out of 2

注意:扩展原型是很凶险的:

JavaScript

Object.prototype.keys = function(){ var keys = []; for ( var i in this ) keys.push( i ); return keys; }; var obj = { a: 1, b: 2, c: 3 }; assert( obj.keys().length == 3, "We should only have 3 properties." ); delete Object.prototype.keys;

1
2
3
4
5
6
7
8
9
10
11
12
Object.prototype.keys = function(){
  var keys = [];
  for ( var i in this )
    keys.push( i );
  return keys;
};
var obj = { a: 1, b: 2, c: 3 };
assert( obj.keys().length == 3, "We should only have 3 properties." );
delete Object.prototype.keys;

输出: FAIL We should only have 3 properties.

借使不是有异样必要而去扩张原生对象和原型(prototype)的做法是不佳的

JavaScript

//不要这么做 Array.prototype.map = function() { // code };

1
2
3
4
//不要这样做
Array.prototype.map = function() {
    // code
};

除非那样做是值得的,比如,向一些旧的浏览器中加多一些ECMAScript5中的方法。
在这种情形下,大家日常这样做:

XHTML

<script type="text/javascript"> if (!Array.prototype.map) { Array.prototype.map = function() { //code }; } </script>

1
2
3
4
5
6
7
<script type="text/javascript">
    if (!Array.prototype.map) {
        Array.prototype.map = function() {
            //code
        };
    }
</script>

prototype 属性名称带来的误解

有一点有关 JavaScript 的原型的误解。 一个对象的原型与对象的 prototype 属性实际不是叁回事。 前面三个用于在原型链中相称荒诞不经的性质。后面一个用于通过 new 关键字创建对象,它将用作新创制对象的原型。 掌握二者的距离,将扶持你到底领略 JavaScript 中的原型性格。

在大家的例证中, Rectangle.prototype 是用 new Rectangle() 成立出来目的的原型, 而 Rectangle 的原型实际上是 JavaScript 的 Function.prototype。(子对象的原型是父对象的 prototype 属性)

指标中保留原型的变量,也被称作内部原型引用(the internal prototype link),历史上也曾称之为 __proto__ ,对这一个称谓始终存在一些争辨。 更规范的,它能够被叫做 Object.getPrototypeOf(...) 的重返值。

2 赞 5 收藏 2 评论

验证

优化网页的一种办法正是浏览器可管理不合法的HTML 代码。合法的HTML代码很轻松调试,且占内存少,开销财富少,易于分析和渲染运转起来更加快。违规的HTML代码让贯彻响应式设计变得要命困难。

当使用模板时,合法的HTML代码显得煞是首要,平常会发出模板单独运营突出,当与另外模块集成时就报五光十色的失实,由此应当要确定保证HTML代码的质量,可使用以下格局:

  • 在工作流中增加验证作用:使用表明插件如HTMLHint或SublineLinter协理你质量评定代码错误。
  • 利用HTML5文档类型
  • 管教HTML的档次结构易于维护,要防止成分嵌套处于左开状态。
  • 确认保证增加各要素的收尾标签。
  • 剔除不供给的代码 ;无需为自关闭的成分增添结束标签;Boolean 属性没有要求赋值,若是存在则为True;

<video src="foo.webm" autoplay="" controls=""/>

1
<video src="foo.webm" autoplay="" controls=""/>

用原型扩大对象

对js原生对象的扩充无非正是往prototype里登记,举例,我们可以后String对象里扩大ltrim,rtrim等方法。js各种对象都接二连三自Object,而且,对象和另外品质都由此prototype目的来继续。通过prototype目的,大家能够扩展任何对象,满含内建的目的,如StringDate

关于作者:alvendarthy

云顶集团400800044 15

一个热爱生活的玩意儿! 个人主页 · 小编的文章 · 16

云顶集团400800044 16

代码格式

格式一致性使得HTML代码易于阅读,明白,优化,调节和测量试验。

String对象的恢宏

JavaScript

<script type="text/javascript"> if(typeof String.prototype.ltrim=='undefined'){ String.prototype.ltrim = function(){ var s = this; s = s.replace(/^s*/g, ''); return s; } } if(typeof String.prototype.rtrim=='undefined'){ String.prototype.rtrim = function(){ var s = this; s = s.replace(/s*$/g, ''); return s; } } if(typeof String.prototype.trim=='undefined'){ String.prototype.trim = function(){ return this.ltrim().rtrim(); } } if(typeof String.prototype.htmlEncode=='undefined'){ String.prototype.htmlEncode = function(encodeNewLine){//encodeNewLine:是否encode换行符 var s = this; s = s.replace(/&/g, '&'); s = s.replace(/</g, '<'); s = s.replace(/>/g, '>'); s = s.replace(/'/g, '"'); if(encodeNewLine){ s = s.replace(/rn/g, '<br />'); s = s.replace(/r/g, '<br />'); s = s.replace(/n/g, '<br />'); } return s; } } </script>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<script type="text/javascript">
    if(typeof String.prototype.ltrim=='undefined'){
        String.prototype.ltrim = function(){
            var s = this;
            s = s.replace(/^s*/g, '');
            return s;
        }
    }
 
    if(typeof String.prototype.rtrim=='undefined'){
        String.prototype.rtrim = function(){
            var s = this;
            s = s.replace(/s*$/g, '');
            return s;
        }
    }
 
    if(typeof String.prototype.trim=='undefined'){
        String.prototype.trim = function(){
            return this.ltrim().rtrim();
        }
    }
 
    if(typeof String.prototype.htmlEncode=='undefined'){
        String.prototype.htmlEncode = function(encodeNewLine){//encodeNewLine:是否encode换行符
            var s = this;
            s = s.replace(/&/g, '&amp;');
            s = s.replace(/</g, '&lt;');
            s = s.replace(/>/g, '&gt;');
            s = s.replace(/'/g, '&quot;');
            if(encodeNewLine){
                s = s.replace(/rn/g, '<br />');
                s = s.replace(/r/g, '<br />');
                s = s.replace(/n/g, '<br />');
            }
            return s;
        }
    }
</script>

语义标识

语义指意义相关的东西,HTML 可从页面内容中看出语义:成分和性质的命名一定程度上表明了剧情的剧中人物和功力。HTML5 引进了新的语义成分,如<header>,<footer>及<nav>。

选用合适的元平素编排代码可确认保障代码的易读性:

  • 使用<h1>(<h2>,<h3>…)表示标题,<ul>或<ol>达成列表
  • 瞩目利用<article> 标签之前应增添<h1>标签;
  • 分选符合的HTML5语义成分如<header>,<footer>,<nav>,<aside>;
  • 行使<p>描述Body 文本,HTML5 语义成分能够造成内容,反之不树立。
  • 利用<em>和<strong>标签替代<i>和<b>标签。
  • 动用<label>成分,输入类型,占位符及其余品质来强制验证。
  • 将文件和因素糅合,并作为另一成分的子成分,会产生布局错误,

例如:

<div>Name: <input type="text" id="name"></div>

1
<div>Name: <input type="text" id="name"></div>

Date对象的扩展

getDaysInMonth:获取某月有稍许天

JavaScript

Date.getDaysInMonth = function (year, month) { var days = 0; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31 break; case 4: case 6: case 9: case 11: days = 30; break; case 2: if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) days = 29; else days = 28; break; } return days; } if (typeof Date.prototype.format == 'undefined') { Date.prototype.format = function (mask) { var d = this; var zeroize = function (value, length) { if (!length) length = 2; value = String(value); for (var i = 0, zeros = ''; i < (length - value.length); i++) { zeros += '0'; } return zeros + value; }; return mask.replace(/"[^"]*"|'[^']*'|b(?:d{1,4}|m{1,4}|yy(?:yy)?|([hHMstT])1?|[lLZ])b/g, function ($0) { switch ($0) { case 'd': return d.getDate(); case 'dd': return zeroize(d.getDate()); case 'ddd': return ['Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sat'][d.getDay()]; case 'dddd': return ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][d.getDay()]; case 'M': return d.getMonth() + 1; case 'MM': return zeroize(d.getMonth() + 1); case 'MMM': return ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][d.getMonth()]; case 'MMMM': return ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'][d.getMonth()]; case 'yy': return String(d.getFullYear()).substr(2); case 'yyyy': return d.getFullYear(); case 'h': return d.getHours() % 12 || 12; case 'hh': return zeroize(d.getHours() % 12 || 12); case 'H': return d.getHours(); case 'HH': return zeroize(d.getHours()); case 'm': return d.getMinutes(); case 'mm': return zeroize(d.getMinutes()); case 's': return d.getSeconds(); case 'ss': return zeroize(d.getSeconds()); case 'l': return zeroize(d.getMilliseconds(), 3); case 'L': var m = d.getMilliseconds(); if (m > 99) m = Math.round(m / 10); return zeroize(m); case 'tt': return d.getHours() < 12 ? 'am' : 'pm'; case 'TT': return d.getHours() < 12 ? 'AM' : 'PM'; case 'Z': return d.toUTCString().match(/[A-Z]+$/); // Return quoted strings with the surrounding quotes removed default: return $0.substr(1, $0.length - 2); } }); }; }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
Date.getDaysInMonth = function (year, month) {
            var days = 0;
            switch (month) {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    days = 31
                    break;
                case 4:
                case 6:
                case 9:
                case 11:
                    days = 30;
                    break;
                case 2:
                    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
                        days = 29;
                    else
                        days = 28;
                    break;
            }
            return days;
        }
 
        if (typeof Date.prototype.format == 'undefined') {
            Date.prototype.format = function (mask) {
 
                var d = this;
 
                var zeroize = function (value, length) {
 
                    if (!length) length = 2;
 
                    value = String(value);
 
                    for (var i = 0, zeros = ''; i < (length - value.length); i++) {
 
                        zeros += '0';
 
                    }
 
                    return zeros + value;
 
                };
 
                return mask.replace(/"[^"]*"|'[^']*'|b(?:d{1,4}|m{1,4}|yy(?:yy)?|([hHMstT])1?|[lLZ])b/g, function ($0) {
 
                    switch ($0) {
 
                        case 'd': return d.getDate();
 
                        case 'dd': return zeroize(d.getDate());
 
                        case 'ddd': return ['Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sat'][d.getDay()];
 
                        case 'dddd': return ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][d.getDay()];
 
                        case 'M': return d.getMonth() + 1;
 
                        case 'MM': return zeroize(d.getMonth() + 1);
 
                        case 'MMM': return ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][d.getMonth()];
 
                        case 'MMMM': return ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'][d.getMonth()];
 
                        case 'yy': return String(d.getFullYear()).substr(2);
 
                        case 'yyyy': return d.getFullYear();
 
                        case 'h': return d.getHours() % 12 || 12;
 
                        case 'hh': return zeroize(d.getHours() % 12 || 12);
 
                        case 'H': return d.getHours();
 
                        case 'HH': return zeroize(d.getHours());
 
                        case 'm': return d.getMinutes();
 
                        case 'mm': return zeroize(d.getMinutes());
 
                        case 's': return d.getSeconds();
 
                        case 'ss': return zeroize(d.getSeconds());
 
                        case 'l': return zeroize(d.getMilliseconds(), 3);
 
                        case 'L': var m = d.getMilliseconds();
 
                            if (m > 99) m = Math.round(m / 10);
 
                            return zeroize(m);
 
                        case 'tt': return d.getHours() < 12 ? 'am' : 'pm';
 
                        case 'TT': return d.getHours() < 12 ? 'AM' : 'PM';
 
                        case 'Z': return d.toUTCString().match(/[A-Z]+$/);
 
                            // Return quoted strings with the surrounding quotes removed    
 
                        default: return $0.substr(1, $0.length - 2);
 
                    }
 
                });
 
            };
        }

换种写法会更加好

<div> <label for="name">Name:</label><input type="text" id="name"> </div>

1
2
3
<div>
   <label for="name">Name:</label><input type="text" id="name">
</div>

选择原生js实现复制对象及扩充

jQueryextend()主意能很方便的落实增加对象方法,这里要达成的是:使用原生js贯彻复制对象,扩大对象,类似jQuery中的extend()方法

JavaScript

var obj1 = { name : 'trigkit4', age : 22 }; var obj2 = { name : 'frank', age : 21, speak : function(){ alert("hi, I'm + name "); } }; var obj3 ={ age : 20 }; function cloneObj(oldObj) { //复制对象方法 if (typeof(oldObj) != 'object') return oldObj; if (oldObj == null) return oldObj; var newObj = Object(); for (var i in oldObj) newObj[i] = cloneObj(oldObj[i]); return newObj; } function extendObj() { //扩张对象 var args = arguments;//将传递过来的参数数组赋值给args变量 if (args.length < 2) return; var temp = cloneObj(args[0]); //调用复制对象方法 for (var n = 1; n < args.length; n++) { for (var i in args[n]) { temp[i] = args[n][i]; } } return temp; } var obj =extendObj(obj1,obj2,obj3); console.log(obj);//{ name: 'frank', age: 20, speak: [Function] } console.log(obj1);//{ name: 'trigkit4', age: 22 } console.log(obj2);//{ name: 'frank', age: 21, speak: [Function] } console.log(obj3);//{ age: 20 }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
var obj1 = {
    name : 'trigkit4',
    age : 22
};
var obj2 = {
    name : 'frank',
    age : 21,
    speak : function(){
        alert("hi, I'm + name ");
    }
};
 
var obj3 ={
    age : 20
};
 
function cloneObj(oldObj) { //复制对象方法
    if (typeof(oldObj) != 'object') return oldObj;
    if (oldObj == null) return oldObj;
    var newObj = Object();
    for (var i in oldObj)
        newObj[i] = cloneObj(oldObj[i]);
    return newObj;
}
 
function extendObj() { //扩展对象
    var args = arguments;//将传递过来的参数数组赋值给args变量
    if (args.length < 2) return;
    var temp = cloneObj(args[0]); //调用复制对象方法
    for (var n = 1; n < args.length; n++) {
        for (var i in args[n]) {
            temp[i] = args[n][i];
        }
    }
    return temp;
}
var obj =extendObj(obj1,obj2,obj3);
console.log(obj);//{ name: 'frank', age: 20, speak: [Function] }
console.log(obj1);//{ name: 'trigkit4', age: 22 }
console.log(obj2);//{ name: 'frank', age: 21, speak: [Function] }
console.log(obj3);//{ age: 20 }

本文由云顶集团400800044发布于云顶集团400800044,转载请注明出处:云顶集团400800044:原生对象及扩展,JS宗旨种类

关键词: