弄清原型和原型链

四条大划定规矩

原型和原型链,大致能够用以下几条划定规矩归纳综合,弄清楚了这几条,也就基础吃透了原型和原型链。

  1. 一切的援用范例都有一个__proto__属性,属性值是一个一般对象
  2. 一切的函数都有一个prototype属性,属性值也是一个一般对象
  3. 一切援用范例的__proto__属性值指向其组织函数的prototype属性值
  4. 当试图获得一个对象的某个属性值时,假如这个对象本身没有该属性,就会去它的__proto__(它组织函数的prototype)中查找

(为了轻易起见,下文中__proto__用隐式原型替代,prototype用显式原型替代)
举个栗子:

// 组织函数
function Human(name) {
    this.name = name;
}
Human.prototype.introduce = function(){
    console.log('My name is', this.name);
}

var somebody = new Human('somebody');
console.log(Human.prototype); // Function
console.log(Human.prototype.constructor === Human); // true
console.log(somebody.__proto__ === Human.prototype);  // true
somebody.introduce(); // "My name is somebody"

在上述例子中,Human是组织函数,而somebody是Human的一个实例。从console输出效果能够考证,组织函数的显式原型的constructor属性指向它本身,实例的隐式原型属性指向其组织函数的显式原型。

在实例somebody中并没有introduce要领,该要领现实是在Human.prototype中,由上述第四条,当试图获得一个对象的某个属性值时,假如这个对象本身没有该属性,就会去它的__proto__(它组织函数的prototype)中查找,所以somebody的introduce要领现实上是somebody.__proto__.introduce,也就是Human.prototype.introduce。

上图协助明白吧~
《弄清原型和原型链》

实例的隐式原型属性指向其组织函数的显式原型属性。
一切的一层一层的__proto__连起来,就构成了原型链。比方,在Object.prototype上有一要领toString,而somebody也有,但实在somebody的toString要领并不是本身一切(除非零丁有声明),而是来自于somebody.__proto__.__proto__.__proto__(即Object.prototype),这一点能够经由过程hasOwnProperty证实。

原型相干要领

推断一个对象是不是在原型链上能够用instanceof,推断某一个属性是不是是本身属性能够用hasOwnProperty。

console.log(somebody.hasOwnProperty('name')) // true
console.log(somebody instanceof Object); // true

//语法
// obj.hasOwnProperty(prop)
// object instanceof constructor

后续再出一期与new运算符相干的另有与原型继续、class相干的吧,排期ing。

参考浏览

MDN: instanceof
MDN: constructor
MDN: hasOwnProperty

    原文作者:小乐
    原文地址: https://segmentfault.com/a/1190000015789349
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞