您的位置:首页> 前端教程> JS教程
文章导航

__proto__ 属性

2018-11-2 19:25| 作者: admin| 查看: 1427| 评论: 0|来自: 蚂蚁部落

__proto__属性外观比较奇特,因为它原本是一个内部属性。

不过当前主流浏览器都支持它,并且ES2015将其标准化。

此属性可以返回或者设置对象的原型对象。

首先回顾一下关于prototype原型的相关知识。

代码实例如下:

[JavaScript] 纯文本查看 复制代码运行代码
function F(){
  this.webName="蚂蚁部落";
}
F.prototype={
  age:4,
  address:"青岛市南区"
}
let f=new F();
console.log(f.address);

代码运行效果截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201811/02/192613vkk67jbkcrcyek24.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

代码分析如下:

(1).首先创建构造函数F。

(2).设置构造函数的原型对象是一个自定义对象直接量。

(3).那么构造函数F的对象实例f会继承原型对象中的属性。

下面演示一下__proto__属性在其中的角色,代码实例如下:

[JavaScript] 纯文本查看 复制代码运行代码
function F(){
  this.webName="蚂蚁部落";
}
F.prototype={
  age:4,
  address:"青岛市南区"
}
let f=new F();
console.log(f.__proto__==F.prototype);

代码运行效果截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201811/02/192650o96bx33tb9b6rx3n.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

代码返回值为true,分析如下:

(1).对象实例f的__proto__属性指向它的构造函数的prototype原型对象。

(2).也就是说__proto__属性拥有者身份是对象实例,它指向创建此对象实例的构造函数的原型对象,当然要辩证的看问题,比如构造函数F也具有__proto__属性,因为它也是Function构造函数的实例。

[JavaScript] 纯文本查看 复制代码运行代码
function F(){
  this.webName="蚂蚁部落";
}
F.prototype={
  age:4,
  address:"青岛市南区"
}
let f=new F();
console.log(f.hasOwnProperty("__proto__"));
console.log(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__"));

代码运行效果截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201811/02/192728ogm6mskngi6sik5g.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

代码分析如下:

(1).f.hasOwnProperty("__proto__")返回false,说明此属性是继承自原型链,非自有属性。

(2).__proto__是访问器属性,具体参阅JavaScript get set访问器属性一章节。

关于原型链上的访问器属性特点可以参阅原型链上的get与set访问器属性一章节。

最后说明:

(1).虽然__proto__属性已经被标准化,但是并不推荐使用。

(2).推荐使用Object.getPrototypeOf方法与Object.setPrototypeOf方法替代。

(3).使用它设置原型对象,牵一发动全身,同时设置对象的原型操作较为影响性能,应尽量避免类似操作。

1

鲜花

握手

雷人

路过

鸡蛋

刚表态过的朋友 (1 人)

最新评论

返回顶部