原型链(三):prototype与__proto__的差异

从定义上来讲,’_ _ proto_ _ ‘是Object.prototype的一个可读写访问属性,也就是说,操作’_ _ proto_ _ ‘就相当于操作了Object.prototype。

请在非IE浏览器中运行以下代码。

//  创建形状类
function Shape(type) {
    this.type = type;
}
//  设置原型,赋值与Shape.prototype一致
Shape.prototype.__proto__ = {
    author : 'yiifaa',
    version: 1.0
};
//  实例化对象
var shapeA = new Shape();
alert(shapeA.author);   //  输出yiifaa
alert(shapeA.__proto__ === Shape.prototype);    //  输出true

尽管’_ _ proto_ _ ‘属性能够直接操作类型的prototype,但是跟prototype相比,在用法上、兼容性上依旧有较大的差异,更不能替代prototype的作用,当然也有自己的优势,尤其是原型链上。

1. 适用的对象不相同

prototype适用于类的构造器,而不能适用于函数外的对象,否则会报错,而’_ _ proto_ _ ‘属性适用于对象,用于类的构造器则会为方法添加额外的功能。

//  创建形状类
function Shape(type) {
    this.type = type;
}
//  创建圆形类,用于比较
function Circle() {
}
//  作用于函数对象,而不是构造函数的原型
Shape.__proto__.author = 'yiifaa';
//  现在所有的函数都具有author属性,并且等于yiifaa
alert(Circle.author);   //  输出yiifaa
var shapeA = new Shape();
alert(shapeA.author);   //  输出undefined
shapeA.prototype.author = 'yiifaa'; //  报错
Shape.prototype.author = 'yiifee';  //正确
alert(shapeA.author);   //  覆盖之前的值,输出yiifee

2. 兼容性不一样

prototype一直都是Javascript的标准属性,而’_ _ proto_ _ ‘属性直到ES 6版本才加入到规范里,所以prototype几乎能兼容所有的浏览器,而’_ _ proto_ _ ‘属性只能兼容最新版的浏览器,尤其是老版的IE肯定不支持。

3. ‘_ _ proto_ _ ‘能更便捷地嵌套调用

//  能沿着原型链进行修改
shapeA.__proto__.__proto__.version = '1.0';
//   输出版本信息
alert(shapeA.version);  // 输出1.0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值