我正在尝试深入研究JavaScript OOP实践。总的来说,我得到了这个想法,但仍然存在一些问题,尤其是关于对象实例化和添加方法的问题。
创建构造函数时,我过去使用过这两个版本:
function MyConstructor(someArg) {
this.arg = someArg;
}
var MyConstructor = function(someArg) {
this.arg = someArg;
}
两者都可以以相同的方式初始化,但它们是否相同?我问,因为在其中一个中,对象的名称是函数的名称,在另一个中,实际对象是在匿名函数中创建的。
当谈到向对象添加方法时,我遇到了几个让我感到困惑的变化,因为我不太明白它是否只是一个不同的语法或它们的工作方式不同。
这个函数为MyConstructor
的原型添加了一个函数,这意味着所有实例都可以访问它,也就是扩展MyConstructor
的对象,因为它在原型链中。
MyConstructor.prototype.showArg = function() {
console.log(this.arg);
}
有时我也会看到这样的事情:
MyConstructor.prototype = {
showArgument:function() {
console.log(this.arg);
},
};
这与第一个例子(MyConstructor.prototype.showArg = function()…
)中的相同吗?
然后我也遇到过这样的语法,这对我不起作用 - 是因为showArg
只添加到一个特定的实例,而不是原型?
MyConstructor.showArg = function() {
console.log(this.arg);
}
此外,似乎还有一种jQuery方式:
$.extend(MyConstructor.prototype, {
showArgument:function() {
console.log(this.arg);
},
});
这可能与前两个示例相同,因为它为原型添加了属性,它呢?
答案 0 :(得分:4)
MyConstructor.prototype引用该对象。当你指定它时
MyConstructor.prototype = {
showArgument:function() {
console.log(this.arg);
},
};
它实际上是使用showArgument作为一个属性创建一个新对象。通过原型继承的所有其他默认属性都将丢失。但是当你做的时候
MyConstructor.prototype.showArg = function() {
console.log(this.arg);
}
这会扩展现有对象,使其具有附加属性showArg,以保持其他属性不变。
JQuery的extend()API提供了一种扩展对象并向其添加属性的方法。它更像是一种JQuery的做事方式。
答案 1 :(得分:1)
原型示例绝对是不相同的东西;在第二个示例中,从原型中完全删除所有内容,除了 showArgument
函数。
仅设置showArg
MyConstructor.prototype.showArg = function() {
console.log(this.arg);
}
将原型设置为 showArgument
MyConstructor.prototype = {
showArgument:function() {
console.log(this.arg);
},
};