关于原型链的文章之前写了一篇
今天想用另一个视角再把原型链理解一遍,主要通过分析对象的__proto__属性和contructor属性反向理解原型链。
我分三层进行分析,第一层分析Object、Object.prototype及 由Object派生的对象实例。
第二层分析自定义构造函数,及该构造函数原型对象,派生对象实例
第三层分析继承型的构造函数,及该构造函数原型对象,派生对象实例
第一层
构造函数Object
__proto__属性 | contructor属性 |
无 | 无 |
console.log("Object", Object);
console结果如下:
Object的原型对象Object.prototype
__proto__属性 | contructor属性 |
无 | 有 指向构造函数Object Object.prototype.constructor=Object |
console.log("Object.prototype", Object.prototype);
对象实例 new Object()
__proto__属性 | contructor属性 |
有 指向原型对象 a.__proto__=Object.prototype 也就是 (new Object).__proto__=Object.prototype
| 无 |
var a = new Object();console.log("a", a);
第二层
自定义构造函数Dog
__proto__属性 | contructor属性 |
无 | 无 |
function Dog(name) { this.name = name; this.type = 'Dog'; } console.log("Dog", Dog);
console结果如下:
自定义构造函数Dog的原型对象Dog.prototype
__proto__属性 | contructor属性 |
有 不知道指向哪里 猜测是指向到Object原型对象 Dog.prototype.__proto__=Object.prototype ? | 有 指向构造函数Dog Dog.prototype.constructor=Dog |
console.log("Dog.prototype", Dog.prototype);
Dog对象实例 new Dog()
__proto__属性 | contructor属性 |
有 指向原型对象 doggie.__proto__=Dog.prototype 也就是 (new Dog).__proto__=Dog.prototype即 (new Dog).__proto__.__proto__=Object.prototype | 无 |
var doggie = new Dog("wangwang");console.log("new Dog", doggie);
对于通过对象字面量创建的对象链接到Object.prototype即 通过对象字面量创建的对象.__proto__=Object.prototype 这点和new出来的对象是不同的。
当你创建一个新对象时,你可以选择某个对象最为它的原型。以下代码给Object.create方法创建一个使用对象作为期原型的新对象。
if (typeof Object.beget !== 'function') { Object.create = function (o) { var F = function () { }; F.prototype = o; return new F(); }; }
下面给出一个使用的例子
var stooge = { "first-name": "liu", "last-name": "yi" };var another_stooge = Object.create(stooge);
根据观察
stooge.__proto__ === Object.prototype
another_stooge.__proto__ === stooge another_stooge.__proto__.__proto__ === Object.prototype