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__)形成的链,我们叫做原型链