prototype

2019-11-05  本文已影响0人  yuho_小豪哥

原型链

创建对象有几种方法

var o1 = { name: "o1" }; // 对象原型链指向 object,故此归为一类
var o2 = new Object({ name: "o2" });
var M = function(name) {
  this.name = "o3";
};
var o3 = new M("o3");
var p = { name: "p" };
var o4 = Object.create(p);

原型、构造函数、实例、原型链

M.__proto__ === Function.prototype; // true

instanceof 的原理

o3 instanceof M; // true
o3.__proto__ === M.prototype; // true
M.prototype.__proto__ === Object.prototype; // true
// 用 constructor 来判断会更严谨
o3.__proto__.constructor === M; // true
o3.__proto__.constructor === Object; // false
function instanceof(left, right) {
    // 获得类型的原型
    let prototype = right.prototype
    // 获得对象的原型
    left = left.__proto__
    // 判断对象的类型是否等于类型的原型
    while (true) {
        if (left === null)
            return false
        if (prototype === left)
            return true
        left = left.__proto__
    }
}

new 运算符

// 代码模拟 new 函数执行的过程
var new2 = function(func) {
    var o = Object.create(func.prototype);
    var k = func.call(o);
    if (typeof k === "object") {
        return k;
    } else {
        return o;
    }
};

new 的过程

function create() {
    // 创建一个空的对象
    let obj = new Object();
    // 获得构造函数
    let Con = [].shift.call(arguments);
    // 链接到原型
    obj.__proto__ = Con.prototype;
    // 绑定 this,执行构造函数
    let result = Con.apply(obj, arguments);
    // 确保 new 出来的是个对象
    return typeof result === "object" ? result : obj;
}
上一篇下一篇

猜你喜欢

热点阅读