prototype

原型链

创建对象有几种方法

  • 对象字面量
var o1 = { name: "o1" }; // 对象原型链指向 object,故此归为一类
var o2 = new Object({ name: "o2" });
  • 通过构造函数
var M = function(name) {
  this.name = "o3";
};
var o3 = new M("o3");
  • Object.create
var p = { name: "p" };
var o4 = Object.create(p);

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

  • 函数才有 prototype,实例对象是没有 prototype 的,函数既是函数也是对象,因此有 proto
M.__proto__ === Function.prototype; // true

instanceof 的原理

  • instanceof 的原理就是判断实例对象的 proto 与构造函数的 prototype 的引用是否相同
  • 只要在原型链上的构造函数,instanceof 都会返回 true
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 运算符

  • 一个新对象被创建。它继承自 foo.prototype
  • 构造函数 foo 被执行。执行的时候,相应的传参会被传入,同时上下文 (this)会被指定为这个新实例。new foo 等同于 new foo(),只能用在不传递任何参数的情况
  • 如果构造函数返回了一个“对象”,那么这个对象会取代整个 new 出来的结果。如果构造函数没有返回对象,那么 new 出来的结果为步骤 1 创建的对象
// 代码模拟 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 的过程

  • 新生成了一个对象
  • 链接到原型
  • 绑定 this
  • 返回新对象
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;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 特别说明,为便于查阅,文章转自https://github.com/getify/You-Dont-Know-JS...
    杀破狼real阅读 1,167评论 0 4
  • 大部分面向对象的编程语言,都以“类”(class)为基础,实现对象的继承。JavaScript 语言不是如此,它的...
    许先生__阅读 328评论 0 2
  • 转载地址:http://javascript.ruanyifeng.com/oop/prototype.html#...
    化城阅读 401评论 0 1
  • 在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例。但是在Ja...
    DecadeHeart阅读 868评论 1 3
  • ⊙ 零 点 窗外还有火光在游荡我紧跟于身后,试图靠近四周静得,只剩下自己的呼吸我变得小心翼翼,伸手却只捕捉到一条条...
    了半文学阅读 280评论 3 3