我已经在控制台中编写了确切的代码,我遇到的问题是:
代码:
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
答案 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是一个函数。您无法访问具有功能的属性。