1

可能重复:
使用原型与直接在构造函数中定义方法的优势?

在 JavaScript 中创建自定义类和公共方法时的最佳实践是什么,更重要的是……为什么?

使用“this”创建公共方法?

var myClass = function() {

    this.myVar = "this is my value";

    this.myFunc = function() {
        alert( this.myVar );
    };

    this.myFunc();
};

-或者- 使用“原型”创建公共方法?

var myClass = function() {

    this.myFunc();
};

myClass.prototype = {

    myVar: "this is my value",

    myFunc: function() {
        alert( this.myVar );
    }

};

非常感谢!!!

4

1 回答 1

0

使用原型声明方法意味着该方法在任何时候都可用于该原型的实例,只要该实例是在声明方法之后创建的。

在构造函数中声明它this.foo = function(){ ... }意味着该方法仅在构造函数中声明它的点之后可用。

作为一个简单的例子,让我们看看命名函数和匿名函数。

下面,我们声明一个命名函数并调用它两次。请注意,即使第一次调用是在函数声明之前,该函数从第一次调用开始就可以正常执行:

foo();

function foo()
{
    alert("foo");
}

foo();

现在,我们将使用存储在变量中的匿名函数来代替命名函数:现在请注意,第一次调用会导致错误,因为foo此时未定义。

foo();

var foo = function()
{
    alert("foo");
}

foo();

原型以(概念上)类似的方式工作,当我们更改函数的原型时,我们会在创建该函数的实例之前影响它。所以以下工作正常:

function f ()
{
    this.bar();
}

f.prototype.bar = function()
{
    alert("bar");
};

var f1 = new f();

请注意,它f.prototype.bar是在我们调用它的行之后物理声明的。现在将其与this. ...方法进行比较。以下按预期工作

function g()
{
    this.h = function(){
        alert("h");
    };

    this.h();
}

var g1 = new g();

虽然这不是因为我们在this.h为它赋值之前试图调用它:

function g()
{
    this.h();

    this.h = function(){
        alert("h");
    };
}

var g2 = new g();

请注意,虽然影响函数原型仍然使用将匿名函数分配给原型属性的机制。这意味着即使使用原型方法,如果我们在向原型添加函数之前实例化原型的实例,我们也会得到错误。例如,以下工作正常:

function f ()
{
    this.bar();
}

f.prototype.bar = function()
{
    alert("bar");
};

var f1 = new f();

但是如果我们将var f1 = new f();上面的赋值移动到f.prototype.bar我们会得到一个错误:

function f ()
{
    this.bar();
}

var f1 = new f();

f.prototype.bar = function()
{
    alert("bar");
};
于 2012-05-17T13:25:14.897 回答