可以分配JavaScript原型对象而不仅仅是其属性吗
Is it ok to assign the JavaScript prototype object instead of just its properties?
在JavaScript中,我们可以为函数的原型分配属性,也可以直接设置其原型对象:
var MyClass = function() { };
// The "property" form...
MyClass.prototype.foo = function() { ... };
MyClass.prototype.bar = function() { ... };
MyClass.prototype.gah = function() { ... };
// OR the "assignment" form...
MyClass.prototype = {
foo:function() { ... },
bar:function() { ... },
gah:function() { ... }
};
我个人更喜欢赋值形式,因为你可以很容易地将对象包装在闭包中(例如隐藏"私有"对象),如果你后来决定更改"MyClass"的名称,你只需要找到两个位置,而不是几十个。(当然,通过使用和调用一个以现有原型为自变量的函数,"属性"形式也是如此,但在我看来,"赋值"形式似乎更直接。)
有充分的理由使用一种形式而不是另一种形式吗?
[编辑]
正如评论者@Raynos所提到的,第二种形式(赋值)破坏了prototype.constructor
属性,该属性应设置为MyClass函数(默认情况下为第一种形式[property])。这有什么真正的缺点吗(除了没有设置属性之外)?
不使用第二种形式的最大原因是,在分配它之前,你最终会消除原型中存在的任何其他东西。如果这不是你关心的问题,那么没有理由不按照你已经演示的方式声明它。
我认为对prototype
属性使用"赋值"形式还有另一个缺点:在处理"伪经典"继承时,可能会删除prototype.__proto__
属性(原型链)。
当然,有人可能会说,有一种可疑的方法可以解决这个问题,那就是自己附加__proto__
属性来再次连接链。但是,如果您调用父方法,忘记执行此操作将破坏代码。在这里看我的小提琴:http://jsfiddle.net/glenn/v5Yub/
结论:"赋值"形式看起来可能更简单/更干净,但"属性"形式更安全。
我认为在不破坏当前原型的情况下分配函数原型的最佳方法是使用Object.assign.
function myFunction() {
}
Object.assign(myFunction.prototype, {
say(str) { return str },
greet(name) { return "Hello " + name}
})
自EcmaScript2015以来,再也没有理由篡改prototype
属性了。
class
语法提供了更直观的语法所需的内容:
class MyClass {
constructor() { }
foo() { ... }
bar() { ... }
}
当需要更长的原型链时:
class MySuperClass {
constructor() { }
foo() { ... }
bar() { ... }
}
class MyClass extends MySuperClass{
constructor() { }
gah() { ... }
}
- Ajax聊天消息重复而不仅仅是更新
- 鼠标悬停事件影响列表中所有行中的按钮,而不仅仅是特定按钮
- 事件为所有项目而不仅仅是当前项目激发
- 在加载时显示,而不仅仅是在选中时显示
- 删除 HttpCookie 不仅仅是它的值
- 脚本选择所有输入,而不仅仅是复选框
- for 循环中的 if 语句都执行,而不仅仅是一个
- 当将函数传递给方法时,为什么使用匿名函数容器而不仅仅是原始函数有效
- .slideup()删除整个ul,而不仅仅是嵌套的li
- jQuery隐藏所有trs或td,而不仅仅是一个
- 使用Maven压缩所有内容,而不仅仅是源目录
- 如果全局上下文中的变量是属性,那么为了闭包的目的,如何区分它们
- 从数组中删除双值,而不仅仅是javascript中的重复值
- 属性将应用于所有项目,而不仅仅是当前项目
- 获取一个完整的a标记,而不仅仅是href属性
- .match()包含了所有内容,而不仅仅是属性组(Javascript)
- 函数可以修改对象的参数,而不仅仅是属性
- 迭代所有属性,而不仅仅是可枚举的属性
- 可以分配JavaScript原型对象而不仅仅是其属性吗
- 如何从多个元素中获取属性值,而不仅仅是第一个匹配