笨办法理解原型链

2019-05-28 11:35:32 浏览数 (2)

关于原型链的文章之前写了一篇 https://cloud.tencent.com/developer/article/1436914

今天想用另一个视角再把原型链理解一遍,主要通过分析对象的__proto__属性和contructor属性反向理解原型链。

我分三层进行分析,第一层分析Object、Object.prototype及 由Object派生的对象实例。

第二层分析自定义构造函数,及该构造函数原型对象,派生对象实例

第三层分析继承型的构造函数,及该构造函数原型对象,派生对象实例

第一层

构造函数Object

__proto__属性

contructor属性

代码语言:javascript复制
console.log("Object", Object);

console结果如下:

Object的原型对象Object.prototype

__proto__属性

contructor属性

有 指向构造函数Object Object.prototype.constructor=Object

代码语言:javascript复制
console.log("Object.prototype", Object.prototype);

对象实例 new Object()

__proto__属性

contructor属性

有 指向原型对象 a.__proto__=Object.prototype 也就是 (new Object).__proto__=Object.prototype

代码语言:javascript复制
var a = new Object();
console.log("a", a);

第二层

自定义构造函数Dog

__proto__属性

contructor属性

代码语言:javascript复制
    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

代码语言:javascript复制
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

代码语言:javascript复制
var doggie = new Dog("wangwang");
console.log("new Dog", doggie);

对于通过对象字面量创建的对象链接到Object.prototype即 通过对象字面量创建的对象.__proto__=Object.prototype 这点和new出来的对象是不同的。

当你创建一个新对象时,你可以选择某个对象最为它的原型。以下代码给Object.create方法创建一个使用对象作为期原型的新对象。

代码语言:javascript复制
if (typeof Object.beget !== 'function') {
      Object.create = function (o) {
        var F = function () {

        };
        F.prototype = o;
        return new F();
      };
    }

下面给出一个使用的例子

代码语言:javascript复制
 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

0 人点赞