constructor、[[Prototype]]、__proto__用法及區分
阿新 • • 發佈:2018-12-13
原型物件的constructor屬性
原型物件的constructor屬性是一個指向prototype屬性所在函式的指標,即建構函式。
function Person(){
}
Person.prototype.name="Nicholas";
Person.prototype.age=29;
Person.prototype.job="SoftWare Engineer";
Person.prototype.sayName=function(){
console.log(this.name);
};
console.log(Person.prototype.constructor== Person);//true
**注意:**例項物件也有一個constructor屬性,指向的是它的建構函式。
var person1=new Person();
console.log(person1.constructor==Person);//true
例項的[[Prototype]]屬性
例項的內部包含一個指標[[Prototype]],指向建構函式的原型物件。
注意:
1.[[]],表示內部屬性,在JavaScript中不能直接訪問它們。
2.在Firefox、Safari和Chorme在每個物件上都支援一個屬性**__proto__**,來取得建構函式的原型物件。
console.log (person1.__proto__==Person.prototype);//true
3.還可以通過isPrototypeOf()方法確定物件之間是否存在原型物件的關係。
console.log(Person.prototype.isPrototypeOf(person1));//true
4.ECMAScript中增加了一個新方法,叫Object.getPrototypeOf(),在所有支援的實現中,這個方法返回[[prototype]]的值。
console.log(Object.getPrototypeOf(person1)==Person.prototype);//true
console. log(Object.getPrototypeOf(person1).name);//Nicholas
不能重寫原型中的值
var person1=new Person();
var person2=new Person();
person1.name="yyq";
console.log(person1.name);//yyq --來自例項
console.log(person1.hasOwnProperty("name"));//true
console.log(person2.name);//Nicholas --來自原型
console.log(person2.hasOwnProperty("name"));//false
var descriptor1=Object.getOwnPropertyDescriptor(person1.__proto__,"name");
console.log(descriptor1.value);//yyq
var descriptor2=Object.getOwnPropertyDescriptor(person1,"name");
console.log(descriptor2.value);//Nicholas
delete person1.name;//使用delete操作符刪除例項屬性person1.name
console.log(person1.name);//Nicholas ——來自原型
console.log(person1.hasOwnProperty("name"));//false
注: hasOwnProperty()方法(從Object繼承來的)可以檢測一個屬性是存在於例項中,還是存在於原型中。
getOwnPropertyDescriptor()方法物件如果是例項,則只會取得例項屬性的值,不會取得原型屬性的值。