js原型对象的性质(一):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

不能重写原型中的值

扫描二维码关注公众号,回复: 3465339 查看本文章
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()方法对象如果是实例,则只会取得实例属性的值,不会取得原型属性的值。

猜你喜欢

转载自blog.csdn.net/yangyuqingabc/article/details/82924820