Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.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 将原型变量视为静态变量?_Javascript_Prototype - Fatal编程技术网

Javascript 将原型变量视为静态变量?

Javascript 将原型变量视为静态变量?,javascript,prototype,Javascript,Prototype,为什么认为原型上的变量(和方法)是静态的是不正确的?我知道我们使用实例来调用/更改它们,但如果我们更改它们,那么更改将反映到所有实例,而不仅仅是实例本身 function Calculator() { // constructor defined this.add = function(a, b) { return a+b; } } Calculator.prototype.staticvar = 'hello' c1 = new Calculator(); c2

为什么认为原型上的变量(和方法)是静态的是不正确的?我知道我们使用实例来调用/更改它们,但如果我们更改它们,那么更改将反映到所有实例,而不仅仅是实例本身

function Calculator() {
    // constructor defined
    this.add = function(a, b) {
    return a+b;
  }
}

Calculator.prototype.staticvar = 'hello'

c1 = new Calculator();
c2 = new Calculator();

alert(c1.staticvar + ", " + c2.staticvar) // both hello

Calculator.prototype.staticvar = "hey!"

alert(c1.staticvar + ", " + c2.staticvar) // both change to hey!

根据定义,静态变量可以通过类直接访问,而无需创建实例,这是否成为原型对象上的变量/函数不被视为静态的主要原因?

它们不是静态的,而是继承的。Static意味着它可以通过
Calculator.staticvar
访问,而不是
calculatorInstance.staticvar
。所以要回答您的问题,是的,这与您不需要创建实例变量这一事实有关

事实上,在ES6
es中,在成员方法上使用
静态
说明符时会出现这种情况:

类计算器{
static get staticvar(){返回此。\u staticvar;}
静态设置staticvar(value){返回此值。_staticvar=value;}
}
//“私有”属性,由前导下划线表示
计算器。_stativar='hello';
console.log(Calculator.staticvar);
Calculator.staticvar='hey!';

console.log(Calculator.staticvar)Javascript支持原型继承,这与Java等其他编程语言不同。函数原型在函数的所有实例之间共享

我修改了代码以理解差异

function Calculator() {
    // constructor defined
    this.add = function(a, b) {
        return a+b;
    }
}

Calculator.prototype.staticvar = 'hello';

c1 = new Calculator();
c2 = new Calculator();

alert(c1.staticvar + ", " + c2.staticvar) // both hello

c1.staticvar = "hey!";

alert(c1.staticvar + ", " + c2.staticvar) // alerts hey, hello
所以实例c1有它自己的属性staticvar。c2没有自己的属性(staticvar)。因此c2.staticvar引用了它的原型对象


因此,更改实例上的属性不会更改其他实例的属性值。

这是对原型继承的误解。原型是一个实例,而不是一个类定义。实例自动获取在原型上设置的任何内容。您可以将每个新实例视为原型对象的副本。“我知道我们使用该实例来调用/更改它们,但如果我们更改它们,则该更改将反映到所有实例,而不仅仅是实例本身。”如果您使用一个实例来更改它,则更改不会反映到所有其他实例上。在代码中,您没有更改实例;您正在更改共享的
.prototype
。嘿,伙计们,这很可能是“对原型继承的误解”。如果可能,请创建答案,以便我将其标记为正确。请参阅