java脚本中'new'的异常行为

时间:2015-08-12 07:30:55

标签: javascript

我已经在控制台中编写了确切的代码,我遇到的问题是:

  1. 为什么定义了xyz.c
  2. 为什么abc.count未定义
  3. 代码:

    function setup()
    {
       this.count = 0;
       return function() 
        {
           this.c = 1;
           return this.c;
        };
    };
    var abc = new setup();
    abc.count;
    //undefined 
    var xyz = new abc();
    xyz.c;
    //1
    

4 个答案:

答案 0 :(得分:2)

来自new operator上的MDN docs

  

构造函数返回的对象成为结果   全新的表达 *。如果构造函数不起作用   显式返回一个对象,使用在步骤1中创建的对象   代替。 (通常情况下,施工人员不会返回值,但他们可以   如果他们想要覆盖正常的对象创建,请选择这样做   过程。)

*强调我的

您在此处所做的是覆盖new的默认行为。您的代码等同于以下内容:

var abc = function() 
{
    this.c = 1;
    return this.c;
};
abc.c; // undefined. 

即使您已在此阶段声明this.c function()实际上已执行,因此this.c仍然未定义

然后,您使用传统方法new abc,所以:

var xyz = new function() {
    this.c = 1;
    return this.c;
};
xyz.c === 1; // Works, because you've new'd the function correctly

假设您正在尝试实现面向对象的计数器样式函数,您可以尝试以下方法:

function setup()
{
   this.count = 0;
   this.increment = function() {
       this.count++;
   }
};
var counter = new setup();
counter.increment();
counter.increment();
console.log(counter.count); // 2
var counter2 = new setup();
counter2.increment();
console.log(counter2.count); // 1

或使用原型继承:

function setup() {}
setup.prototype.count = 0;
setup.prototype.increment = function() {
    this.count++;
};

虽然命名约定会规定您应该将称为:

function Counter() {
    this.value = 0;
    this.increment = function();
}
var first = new Counter();

答案 1 :(得分:0)

typeof abc是“function”,它应该是访问abc.count的对象。我在执行“var xyz = new abc();”

时遇到此错误

VM40:7未捕获的ReferenceError:未定义count     在新的(:7:17)     时间:2:11     at Object.InjectedScript._evaluateOn(:905:140)     at Object.InjectedScript._evaluateAndWrap(:838:34)     at Object.InjectedScript.evaluate(:694:21)

这是不正确的。我想知道你是如何得到3?

答案 2 :(得分:0)

JavaScript确实prototypical heritage。您正在尝试为函数调用构造函数,而函数又返回一个函数。

尝试console.log(setup)查看其中包含的内容。它不是一个对象,它没有计数属性,它是一个函数。当您通过setup()()调用它时,它将始终返回1.

你想要的是这样的:

var Counter = {
    count: 0,
    increaseCount: function() {
         return ++this.count;        
    }
}

var abc = Object.create(Counter);
abc.increaseCount(); // 1
abc.increaseCount(); // 2

答案 3 :(得分:0)

你可以看到typeof xyz是object,因此它正在访问函数的属性。和typeof abc是一个函数。您无法访问具有功能的属性。