Javascript对象:从函数内部设置对象属性或通过其返回值设置对象属性之间有什么区别吗



将名为"sample"的属性设置为1:

方式1:

function Collection() {
    this.sample = function() {
        return 1;
    }
}

方式2:

function Collection() {
    this.sample = function() {
        this.sample = 1;
    }
}

会有什么不同吗?

在第二种情况下,只能调用obj.sample()一次;之后你会试着拨打1号电话。

var obj = new Collection();
var one = obj.sample();
var again = obj.sample();

在第一种情况下,oneagain最终都为1;在第二种情况下,第三行出现异常("Uncaught TypeError:number is not a function")。

巨大的区别:第一个赋值最终会将this.sample设置为返回1的函数,第二个赋值最终将this.ample设置为设置this.sample=1的函数(失去对构造函数中构建的匿名函数的引用),并返回undefined。

因此,对于"方式1":

var c = new Collection();
console.log(c.sample());  // logs "1"
console.log(c.sample());  // logs "1" again

和"方式2":

var c = new Collection();
console.log(c.sample());  // logs nothing (undefined doesn't print anything, iirc)
console.log(c.sample());  // throws an error, since "1" is not a function

您正在做不同的事情:

在第一个示例中,您有一个FUNCTION,它返回数字"1"。

在第二个示例中,您将对象的MEMBER"sample"设置为"1"。

此外,当您第一次调用object.sample(示例#2)时,您将收到nil而不是"1",因为您正在调用设置成员的函数。

第一次通话后,无论何时访问"sample",您都会收到号码"1"。

最新更新