JS prototype 原型

Object.prototype 属性表示 Object 的原型对象。

一个典型的对象继承了 Object.prototype 的属性(包括方法),尽管这些属性可能被覆盖。

Object.prototype.constructor
特定的函数,用于创建一个对象的原型。此属性的值是对函数本身的引用,而不是一个包含函数名称的字符串。

所有对象都会从它的原型上继承一个 constructor 属性:

var o = {};
o.constructor === Object; // true

var o = new Object;
o.constructor === Object; // true

var a = [];
a.constructor === Array; // true

var a = new Array;
a.constructor === Array // true

var n = new Number(3);
n.constructor === Number; // true
function Tree(name) {
  this.name = name;
}

var theTree = new Tree("Redwood");
console.log( "theTree.constructor is " + theTree.constructor );

打印输出:
theTree.constructor is function Tree(name) {
  this.name = name;
}

能够继承原型的语法

  1. Object.create()
    ES5方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。
    Object.create(proto, [propertiesObject])
    proto新创建对象的原型对象。

    const person = {
      isHuman: false,
      printIntroduction: function () {
        console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
      }
    };
    
    const me = Object.create(person);
    
    me.name = "Matthew"; // "name" is a property set on "me", but not on "person"
    me.isHuman = true; // inherited properties can be overwritten
    
    me.printIntroduction();
    // expected output: "My name is Matthew. Am I human? true"
  2. Function.prototype.bind()
    bind() 最简单的用法是创建一个函数,使这个函数不论怎么调用都有同样的 this 值。

    this.x = 9; 
    var module = {
      x: 81,
      getX: function() { return this.x; }
    };
    
    module.getX(); // 返回 81
    
    var retrieveX = module.getX;
    retrieveX(); // 返回 9, 在这种情况下,"this"指向全局作用域
    
    // 创建一个新函数,将"this"绑定到module对象
    var boundGetX = retrieveX.bind(module);
    boundGetX(); // 返回 81

不能够继承原型链的语法

  1. Object.create(null)
    ES5的语法
  2. Object.setPrototypeOf 方法改变原型链
    推荐使用Object.create() 来改变原型引用

Object.getPrototypeOf() 
方法返回指定对象的原型。

const prototype1 = {};
const object1 = Object.create(prototype1);

console.log(Object.getPrototypeOf(object1) === prototype1);
// expected output: true

prototypeObj.isPrototypeOf(object)
方法用于测试一个对象是否存在于另一个对象的原型链上。

obj.hasOwnProperty(prop)
方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性,不包括继承来的属性

instanceof运算符
用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置;
多个frame或多个window不适用。

function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}
var auto = new Car('Honda', 'Accord', 1998);

console.log(auto instanceof Car);
// expected output: true

console.log(auto instanceof Object);
// expected output: true