15、获取原型对象中的属性

1、往原型对象中添加属性

//创建一个构造函数

function MyClass() {



}

var mc = new MyClass();//构造一个mc的实例

/*因为MyClass中没有name属性,它就会往MyClass.prototype中找,在MyClass的原型对象中也没有找到*/

console.log(mc.name)//Uncaught TypeError: Cannot read property 'name' of undefined



/*从MyClass中添加原型对象*/

MyClass.prototype.name = "我是原型对象中的name属性";

var mc2 = new MyClass();

console.log(mc2.name);//我是原型对象中的name属性

2、使用hasOwnProperty("属性名")方法判断对象自身是否含有指定的属性

用in检查一个对象中是否有指定的属性,如果对象中没有就会往原型对象中找。

console.log("name" in mc2)//true

但是这样是无法知道是mc2里面有name属性还是mc2的原型对象有name属性。当我们需要判断对象本身是否有name属性时,我们需要使用对象的hasOwnProperty()来检查对象自身是否含有该属性

console.log(mc2.hasOwnProperty("name"))//false

3、hasOwnProperty从哪里来?

//判断mc2中是否有hasOwnProperty

console.log(mc2.hasOwnProperty("hasOwnProperty"))//false

//我们试着从mc2的原型对象中找

console.log(mc2.__proto__.hasOwnProperty("hasOwnProperty")) //false

//我们试着从mc2的原型对象中的原型对象中找

console.log(mc2.__proto__.__proto__.hasOwnProperty("hasOwnProperty"))//true

我们发现hasOwnProperty这个方法是在原型对象中的原型对象里面的,像以上代码中,在原来对象中没有的,但是使用起来得心应手的方法,它就是被包含在原型对象,或者原型对象的原型对象里面的

4、原型对象的尽头

原型对象也是对象,所以也有原型,当我们使用一个对象的属性或调用一个方法时,我们会在自身中对象中寻找,如果自身对象中有,则直接使用,如果没有则在原型对象中寻找,如果原型对象中没有,则在原型对象中的原则对象寻找,直到找到的是beject对象

console.log(mc2.__proto__)

console.log(mc2.__proto__.__proto__)

这里我们可以看见hasOwnProperty是在原型对象的原型对象中的

我们继续找找原型对象的原型对象的原型对象看看。。。

console.log(mc2.__proto__.__proto__.__proto__)//null

返回一个null,这说明我们已经找到了Obeject原型对象了,已经是尽头了,如果在Obeject中没有找到那么将会返回undefined。

console.log(mc2.__proto__.__proto__.__proto__.__proto__)//Uncaught TypeError: Cannot read property '__proto__' of null

5、原型链

一层层往下找原型对象(.__proto__.__proto__.__proto__)形成的链,我们叫做原型链

猜你喜欢

转载自blog.csdn.net/weixin_39704454/article/details/81109924