JavaScript进阶之原型链

对象

 1 function f1(){
 2 };
 3 typeof f1 //"function"函数对象
 4 
 5 
 6 var o1 = new f1();
 7 typeof o1 //"object"普通对象
 8 
 9 var o2 = {};
10 typeof o2 //"object"普通对象

JavaScript中将对象分为普通对象函数对象javascript

使用函数对象能够建立普通对象,普通对象无法建立函数对象。java

凡是经过new Function建立的对象都是函数对象,其余都是普通对象(一般经过Object建立),能够经过typeof来判断。git

原型对象(prototype

Prototype

Prototype有原型、蓝本的意思,只有函数对象才会有原型(prototype)。github

所谓原型,就是函数用来建立实例(普通)对象的蓝本(原型)。浏览器

每一个原型都有一个 constructor 属性指向关联的构造函数。函数

__proto__

每个JavaScript对象(除了 null )都具备的一个属性,叫__proto__,这个属性会指向该对象的原型(prototype)。性能

constructor

构造函数,即用来建立实例的函数,即关联的函数对象自己。spa

验证

在火狐或者谷歌浏览器控制台中新建一个普通对象,查看他的属性。.net

1 var o = {};
2 console.log(o.prototype); //undefined  普通对象没有prototype属性
3 console.log(o instanceof Object); //true  o是Object的实例
4 console.log(o.__proto__ === Object.prototype) //true  o的__proto__指向Object的prototype
5 console.log(Object === Object.prototype.constructor) //true  Object.prototype.constructor指向Object自己
6 console.log(Object.prototype.constructor) //function Object() 函数对象原型的构造函数指向这个函数 
7 console.log(Object.prototype.__proto__); //null Object.prototype的__proto__为null,为原型链终点

新建一个函数对象,查看他的属性。prototype

1 function Demo() { };
2 var f1 = new Demo();
3 console.log(f1.prototype); //undefined  经过函数对象穿建立的是普通对象,Demo自己是函数对象
4 console.log(f1 instanceof Demo); //true  f1是Demo的实例
5 console.log(f1.__proto__ === Demo.prototype); //true
6 console.log(Demo === Demo.prototype.constructor);//true
7 console.log(Demo.prototype.__proto__ === Object.prototype);//true  Demo原型的__proto__指向Object的原型prototype
8 console.log(Object.prototype.__proto__); //null

原型的重要功能就是用做继承。

原型链(prototype chain

javascript中,每一个对象都会在内部生成一个__proto__ 属性,当咱们访问一个对象属性时,若是这个对象不存在就回去__proto__ 指向的对象里面找,一层一层找下去,这就是javascript原型链的概念。

提高:

  1. 在原型链上查找属性比较耗时,对性能有反作用,这在性能要求苛刻的状况下很重要。另外,试图访问不存在的属性时会遍历整个原型链。
  2. 遍历对象的属性时,原型链上的每一个可枚举属性都会被枚举出来。要检查对象是否具备本身定义的属性,而不是其原型链上的某个属性,则必须使用对象从Object.prototype继承的 hasOwnProperty 方法。(使用 for in 遍历对象时推荐老是使用 hasOwnProperty 方法)

继承

JavaScript 并无其余基于类的语言所定义的“方法”。在 JavaScript 里,任何函数均可以添加到对象上做为对象的属性。函数的继承与其余的属性继承没有差异。

继承意味着复制操做,在Java和C#中,继承是彻底复制生成新的对象。然而 JavaScript 默认并不会复制对象的属性,相反,JavaScript 只是在两个对象之间建立一个关联,这样,一个对象就能够经过委托访问另外一个对象的属性和函数,因此与其叫继承,委托的说法反而更准确些。

结论

在编写使用它的复杂代码以前,理解原型继承模型是相当重要的。此外,请注意代码中原型链的长度,并在必要时将其分解,以免可能的性能问题。此外,原生原型不该该被扩展,除非它是为了与新的JavaScript特性兼容。

参考文档: https://www.jb51.net/article/123976.htm

      https://github.com/mqyqingfeng/Blog/issues/2

      https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

相关文章
相关标签/搜索