JavaScript OOP:使用不同的语法

时间:2015-10-14 21:09:23

标签: javascript jquery oop

我正在尝试深入研究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);
    },
});

这可能与前两个示例相同,因为它为原型添加了属性,它呢?

2 个答案:

答案 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);
    },
};