Javascript java脚本中“new”的异常行为
我已经在console中编写了准确的代码,我在使用此代码时面临的问题是: 为什么定义xyz.c 为什么abc.count没有定义 代码:Javascript java脚本中“new”的异常行为,javascript,Javascript,我已经在console中编写了准确的代码,我在使用此代码时面临的问题是: 为什么定义xyz.c 为什么abc.count没有定义 代码: abc类型是访问abc.count时应作为对象的函数。我在执行var xyz=newabc时遇到这个错误 VM40:7未捕获引用错误:未定义计数 纽约时间:7:17 两点十一分 在Object.InjectedScript.\u evaluateOn:905:140 在Object.InjectedScript.\u evaluateAndWrap:838:3
abc类型是访问abc.count时应作为对象的函数。我在执行var xyz=newabc时遇到这个错误 VM40:7未捕获引用错误:未定义计数 纽约时间:7:17 两点十一分 在Object.InjectedScript.\u evaluateOn:905:140 在Object.InjectedScript.\u evaluateAndWrap:838:34 在Object.InjectedScript.evaluate:694:21 这是不正确的。我想知道你是如何得到3的?JavaScript是这样做的。您正在尝试调用函数的构造函数,而该构造函数又返回一个函数 请尝试console.logsetup查看它包含的内容。它不是一个对象,它没有计数属性,它是一个函数。当您通过设置调用它时,它将始终返回1 您想要的可以这样工作:
var Counter = {
count: 0,
increaseCount: function() {
return ++this.count;
}
}
var abc = Object.create(Counter);
abc.increaseCount(); // 1
abc.increaseCount(); // 2
您可以看到typeof xyz是对象,因此它正在访问函数的属性。abc的类型是一个函数。无法使用函数访问属性。从新运算符上的: 构造函数返回的对象成为 全新的表达方式*。如果构造函数没有 显式返回一个对象,使用在步骤1中创建的对象 相反通常构造函数不返回值,但可以 如果要覆盖普通对象创建,请选择这样做 过程 *重点矿山 您在这里所做的是重写new的默认行为。您的代码等同于以下内容:
var abc = function()
{
this.c = 1;
return this.c;
};
abc.c; // undefined.
即使您已经声明了这个.c,您的函数在这个阶段还没有实际执行,所以这个.c仍然是未定义的
然后,您可以使用传统方法创建新的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 Counter() {
this.value = 0;
this.increment = function();
}
var first = new Counter();
或者使用原型继承:
function setup() {}
setup.prototype.count = 0;
setup.prototype.increment = function() {
this.count++;
};
尽管命名约定要求您应该对类进行如下调用:
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 Counter() {
this.value = 0;
this.increment = function();
}
var first = new Counter();
很抱歉,现在我已经编辑了我的代码。请检查它@RGrahamnew应该只用于构造函数。构造函数不返回函数。安装程序不是构造函数。很抱歉,现在我已经编辑了我的代码。请检查我的