1. 程式人生 > >constructor、[[Prototype]]、__proto__用法及區分

constructor、[[Prototype]]、__proto__用法及區分

原型物件的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()方法物件如果是例項,則只會取得例項屬性的值,不會取得原型屬性的值。