我正在尝试深入挖掘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);
},
});
这可能和前两个例子一样,因为它给原型添加了属性,对吗?
MyConstructor。原型指的是对象。当你把它赋值为
MyConstructor.prototype = {
showArgument:function() {
console.log(this.arg);
},
};
它实际上是创建一个新的对象,showArgument作为一个属性。通过原型继承的所有其他默认属性都将丢失。但是当你这样做
MyConstructor.prototype.showArg = function() {
console.log(this.arg);
}
扩展了现有的对象,增加了一个属性showArg,使其他属性保持不变。
JQuery的extend() API提供了一种扩展对象并为其添加属性的方法。原型的例子绝对是不是一样的东西;在第二个示例中,完全删除了原型中的所有内容,除了 showArgument
函数。
只设置showArg
MyConstructor.prototype.showArg = function() {
console.log(this.arg);
}
集原型只 showArgument
MyConstructor.prototype = {
showArgument:function() {
console.log(this.arg);
},
};