
原型:每个对象都有原型(__proto__)指向其构造函数的原型对象(prototype属性)
原型链:
每个对象都会在其内部初始化一个属性,就是 prototype (原型),当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去 prototype 里找这个属性,这个prototype 又会有自己的 prototype ,于是就这样一直找下去,也就是我们平时所说的原型链的概念
function Star(name, age) {
this.name = name;
this.age = age;
this.sing = function () {
console.log(this.name + '会唱歌');
}
}
// 每个对象从被创建开始就和 “另一个对象”上继承属性,“另一个对象”就是原型
// 由对象和原型组成的链就叫原型链
var ldh = new Star('刘德华', 3);
//每一个构造函数都有prototype属性,该属性指向一个对象
//实例化对象都会有一个属性__proto__,指向构造函数的原型对象prototype
console.log(Star.prototype); //constructor: ƒ Star(name, age)
console.log(Star.prototype == ldh.__proto__); //true
//Star的原型对象prototype的构造函数construor指向Star本身
console.log(Star.prototype.constructor == Star); //true
//Star原型对象prototype.__proto__指向Object原型对象prototype
console.log(Star.prototype.__proto__ == Object.prototype); //true
//Object原型对象prototype的构造函数construor指向Object构造函数
console.log(Object.prototype.constructor == Object); //true
//Object原型对象prototype.__proto__指向空null
console.log(Object.prototype.__proto__); //null
- 当访问一个对象的属性和方法时,首先查找这个对象自身有没有该属性
- 如果没有,就查找他的原型(__proto__指向的prototype对象)
- 如果依然没有,就查找原型对象的原型(Object的原型对象)
- 以此类推一直找到Object为止(null)
- 若整个原型链都没有查到,返回undefined
如:访问 ldh 对象的 aaa属性,已知ldh上并无该属性,Star、Object也无,故结果返回undefined
console.log(ht.aaa); // undefined如果想要ldh对象可以访问的aaa属性,可以在Star的prototype添加该属性
Star.prototype.aaa = 'aaa'
console.log(ldh.aaa); // aaa版权声明:本文为qq_44302255原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。