通过__proto__原型来继承JavaScript是否不好
Is it bad to inherit in JavaScript by putting __proto__ to prototype?
这是从Parent
继承Child
的一种方法:
function Parent(a)
{
this.a = a;
}
Parent.prototype =
{
constructor: Parent,
parentValue: 123
};
function Child(a, b)
{
Parent.call(this, a);
this.b = b;
}
Child.prototype =
{
constructor: Child,
childValue: 456,
__proto__: Parent.prototype
};
child = new Child(1, 2);
// Logs 1 2 456 123
console.log(child.a, child.b, child.childValue, child.parentValue);
这种继承方式有缺点吗?
这背后的理由是我想批量添加属性,例如 Foo.prototype = { a: 1, b: 2 }
而不是Foo.prototype.a = 1; Foo.prototype.b = 2;
,因为后者太啰嗦了。
通过放置 JavaScript 来继承 JavaScript
__proto__
不好吗?
是的,因为它不是标准的 (*(。更好的使用Object.create
:
function Parent(a) {
this.a = a;
}
Parent.prototype.parentValue = 123;
function Child(a, b) {
Parent.call(this, a);
this.b = b;
}
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
Child.prototype.childValue = 456;
var child = new Child(1, 2);
console.log(child.a, child.b, child.childValue, child.parentValue);
// Logs 1 2 456 123
或者,如果您想支持较旧的浏览器,而不是Object.create
Child.prototype = new Parent();
请注意,此方法将导致Child
实例继承未定义的a
属性,但由于您将使用 Parent.call(this, a)
创建自己的属性,因此这并不重要。
如果要避免冗长的Foo.prototype.a = 1; Foo.prototype.b = 2;
,可以使用extend
函数:
function extend(obj, props) {
for(var i in props) if(props.hasOwnProperty(i))
obj[i] = props[i];
}
extend(Child.prototype, {
constructor: Child,
childValue: 456
});
(*( ES6 在 Web 浏览器的附加 ECMAScript 特性的(规范性(附录中包含了__proto__
(注意,该规范编纂了已经实现中的内容(,但如果 ECMAScript 主机不是 Web 浏览器,则使其成为可选的。但是MDN说__proto__
已被弃用。
另外,ES6引入了Object.setPrototypeOf()
,它允许像__proto__
一样更改原型,但MDN警告:
改变对象的
[[Prototype]]
,使用此方法或 强烈建议不要弃用Object.prototype.__proto__
, 因为它非常慢,并且不可避免地会减慢后续速度 在现代 JavaScript 实现中执行。
- 是否可以控制获取哪些Google地图脚本(JavaScript API)
- 用于检查数组中是否存在元素的javascript自定义方法
- 是否可以在浏览器中使用纯JavaScript保存音频流
- 是否可以使用JavaScript/AAJAX在客户端创建一个文件
- 我是否可以检测到javascript正在被卸载(作为调试模式)
- PhantomJS - 检查javascript函数是否正在运行的任何方法
- 是否有任何JavaScript UI组件可以显示字符串之间的差异
- javascript跨浏览器确定用户是否滚动到页面底部
- 是否可以用JavaScript显示等效的文件夹对话框
- 检查是否存在使用chrome扩展的javascript库
- 如何知道javascript for语句中的所有结果是否都是错误的
- 是否存在Javascript Liferay Service库的文档?如何处理错误情况
- 是否可以使用jquery或javascript将自动增量类添加到列表中
- javascript移动交叉浏览器确定用户是否滚动到页面底部
- 有没有一种方法可以从Javascript检测特定的应用程序是否安装在(AndroidiOS)设备上
- javascript数组元素是否知道其封闭数组
- 是否“;对于的“;循环迭代遵循JavaScript中的数组顺序
- 是否有任何设置阻止JavaScript在系统上工作
- 是否可以在javascript中读取IE中的本地文件
- 是否有任何Javascript函数从指定的索引中进行正则表达式匹配