首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有硬绑定的Javascript新特性

带有硬绑定的Javascript新特性
EN

Stack Overflow用户
提问于 2016-06-16 01:16:12
回答 2查看 164关注 0票数 1

我有以下代码片段

代码语言:javascript
复制
function foo(a) {
    this.a = a;
}

var obj = {a: 77};

var bar = function() {
    return foo.apply( obj, arguments );
};

var o = new bar( 2 );

console.log( o.a ); // I think it's 2(why is it undefined?)
console.log(obj.a); // obj.a changed to 2, got it.

为什么o.a未定义?另外,如果我删除了bar中的return关键字,它仍然是一样的。

代码语言:javascript
复制
function foo(a) {
    this.a = a;
}

var obj = {a: 77};

var bar = function() {
    foo.apply( obj, arguments );
};

var o = new bar( 2 );

console.log( o.a ); // I think it's 2(why is it undefined?)
console.log(obj.a); // obj.a changed to 2, got it.

问题是当硬绑定和新绑定同时发生时,实际上会发生什么情况

EN

回答 2

Stack Overflow用户

发布于 2016-06-16 01:20:12

使用new将创建一个新对象,并将该对象作为this分配给调用它的函数。在本例中,您没有使用新对象,而是调用了一个将obj设置为this的函数。

至于为什么添加和删除return不会有任何改变,是因为在这两种情况下,您都会返回undefined。当使用new调用函数并返回undefined (也称为默认返回值)时,它将返回由new生成的新对象。

引用MDN

构造函数返回的对象成为整个新表达式的结果。如果构造函数没有显式返回对象,则使用在步骤1中创建的对象。(通常构造函数不返回值,但如果它们想覆盖正常的对象创建过程,则可以选择返回值。)

因此,您创建了一个新对象,但操作了一个旧对象。您的代码实际上是这样工作的。

代码语言:javascript
复制
function foo(a) {
    this.a = a;
}

var obj = {a: 77};

var bar = function() {
    return foo.apply( obj, arguments );
};

var o = {}; // Originally you used `new` to create a new object
bar(2); // Since `bar` doesn't use `this`, it's the same as if it were called by itself

console.log(o.a); // Empty object
console.log(obj.a); // Modified by `bar`

票数 1
EN

Stack Overflow用户

发布于 2016-06-16 01:23:17

您必须从foo(a)返回this,如下所示:

代码语言:javascript
复制
function foo(a) {
    this.a = a;
    // "this" NEEDS TO BE RETURNED, OTHERWISE (bar)'s 
    // VALUE WILL BE UNDEFINED, THUS o.a WILL BE UNDEFINED
    return this; 
}

var obj = {a: 77};

var bar = function() {
    // MAKE SURE THIS IS RETURNED AS WELL
    return foo.apply( obj, arguments );
};

var o = new bar( 2 );

console.log( o.a ); // I think it's 2(why is it undefined?)
console.log(obj.a); // obj.a changed to 2, got it.

问题是当硬绑定和新绑定同时发生时,实际上会发生什么

在本例中什么都没有,因为当new bar( 2 )的新实例返回值依赖于foo(a),而foo(a)依赖于单例(obj)时,它是无用的。

我希望这对你有帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37841796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档