Effective JavaScript Item 31 优先使用Object.getPrototypeOf,而不是__proto__

本文探讨了在ES5中如何正确地获取对象的原型。介绍了标准API Object.getPrototypeOf的使用方法,并对比了非标准__proto__属性的局限性和潜在问题。推荐在现代JavaScript开发中采用标准化的方法。

本系列作为Effective JavaScript的读书笔记。

 

ES5中引入了Object.getPrototypeOf作为获取对象原型对象的标准API。可是在非常多运行环境中。也提供了一个特殊的__proto__属性来达到相同的目的。

 

由于并非全部的环境都提供了这个__proto__属性,且每一个环境的实现方式各不同样,因此一些结果可能不一致:


// 在某些环境中
var empty = Object.create(null); // object with no prototype
"__proto__" in empty; // false (in some environments)

// 在某些环境中
var empty = Object.create(null); // object with no prototype
"__proto__" in empty; // true (in some environments)

所以当环境中支持Object.getPrototypeOf方法时,优先使用它。

即使不支持。也能够为了实现一个:


if (typeof Object.getPrototypeOf === "undefined") {
	Object.getPrototypeOf = function(obj) {
		var t = typeof obj;
		if (!obj || (t !== "object" && t !== "function")) {
			throw new TypeError("not an object");
		}
		return obj.__proto__;
	};
}

上述代码首先会对当前环境进行检查,假设已经支持了Object.getPrototypeOf,就不会再反复定义。

 

另外,在使用__proto__时会导致一些错误,在Item 45中会进行讨论。

 

总结:

  1. 优先使用标准方法Object.getPrototypeOf。而不是非标准的__proto__属性。

  2. 为非ES5环境实现一个Object.getPrototypeOf方法。从而保持代码的一致性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值