为什么在类中的函数中设置`this.property`会创建一个新属性,但是让`this.property`使用class属性?

时间:2015-11-18 11:22:46

标签: javascript oop object

我在javascript中有一个带有属性(is_initialized)和函数(isInitialized)的类。

课程定义:

function Test()
{
    this.is_initialized = { obj: { isInitialized: 'notyet' } };
    this.isInitialized = function( ref )
    {
        if ( !ref.obj )
        {
            console.log( 'now: ' + JSON.stringify( this.is_initialized ) );
/*line 9*/  this.is_initialized.obj.isInitialized = ref.isInitialized.toString();
            console.log( ref );
        }
        else {
            bluetoothle.isInitialized( this.isInitialized );
/*line 14*/ ref.obj = this.is_initialized.obj;
        }
    };
}

bluetoothle.isInitialized是一个cordova插件中的函数(回答这个问题不需要知道cordova),它返回一个对象{ isInitialized : true/false }并将通过第一个if - 语句我对isInitialized()的来电将执行else

问题:

为什么第9行的this.is_initialized在函数isInitialized中创建了一个新属性,而第14行的this.is_initialized使用is_initialized中的属性Test()? / p>

不应该使用Test()内的属性或使用isInitialized()内的(新)变量吗?

如果它只是'表现得像这样,我该怎么做才能解决它?

代码我跑了

var t = new Test();
var r = {obj:{isInitialized:'nope'}};
t.isInitialized(r);

// console.log( 'now: ' + JSON.stringify( this.is_initialized ) ); on line 8:
// now: {"obj":{"isInitialized":"false"}}

// console.log( ref ); on line 10:
// Object {isInitialized: false}

console.log(JSON.stringify(r));
// {"obj":{"isInitialized":"notyet"}}

console.log(JSON.stringify(t));
// {"is_initialized":{"obj":{"isInitialized":"notyet"}}}

刚刚发生的是:

  • 我创建了一个Test()的新实例,并将其命名为t
  • 我在Test()中创建了一个匹配is_initialized结构但具有不同值的对象。
  • 我用r作为参数调用了函数。
  • else中的代码执行。
  • 调用isInitialized作为回调的异步函数。
  • 该函数在现有is_initializedr
  • 之间创建了引用
  • 异步函数调用isInitialized并执行if
  • 中的代码
  • 它在第8行记录this.is_initialized的当前值,不知何故在第9行执行后得到this.is_initialized
  • 第9行执行,在is_initialized内创建一个名为isInitialized()的新变量,同时我希望它在is_initialized中设置Test(),而不是创建一个在{功能已完成执行。
  • 记录放入this.is_initialized.obj.isInitialized
  • 的对象
  • 我记录r并看到它包含Test.is_initialized的初始值。
  • 我记录并看到is_initialized的值仍然是初始值。

信息:

如果你想自己测试一下,回答我的问题为什么?我该怎么处理它?<​​/ em>但需要{{1}的一些代码只是使用这个:

bluetoothle.isInitialized

我想感谢你阅读这个长期的问题。

1 个答案:

答案 0 :(得分:0)

你在一个职能部门。在函数内部(除非它被声明为Test.prototype.isInitialized),&#39;这个&#39;的范围规则。是不同的。这是ES6旨在消除的陷阱之一。 (如果你添加&#34;使用strict&#34 ;;在函数的顶部,大多数浏览器会告诉你这个。)

在Test中声明var self = this并在内部函数中使用self,你应该得到你想要的结果。 @squint已经说过这个了。