Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript java脚本中“new”的异常行为_Javascript - Fatal编程技术网

Javascript java脚本中“new”的异常行为

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

我已经在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: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应该只用于构造函数。构造函数不返回函数。安装程序不是构造函数。很抱歉,现在我已经编辑了我的代码。请检查我的