Function.prototype Javascript

Function.prototype Javascript,javascript,Javascript,下面是我为理解Function.prototype而编写的示例JS代码 <script> function Foo() { } Foo.prototype = { a: 9 }; var x = new Foo(); var y = new Foo(); console.log('x : ' + x.a + '\n'); console.log('y : ' + y.a + '\n');

下面是我为理解Function.prototype而编写的示例JS代码

<script>

    function Foo() {

    }

    Foo.prototype = {
        a: 9
    };

    var x = new Foo();
    var y = new Foo();

    console.log('x : ' + x.a + '\n');
    console.log('y : ' + y.a + '\n');

    x.a = 1;

    console.log('x : ' + x.a + '\n');
    console.log('y : ' + y.a + '\n');


</script>

函数Foo(){
}
Foo.prototype={
a:9
};
var x=新的Foo();
var y=新的Foo();
console.log('x:'+x.a+'\n');
console.log('y:'+y.a+'\n');
x、 a=1;
console.log('x:'+x.a+'\n');
console.log('y:'+y.a+'\n');
我希望上面代码的执行将导致下面的输出

x:9 y:9 x:1 y:1

但实际产出是

x:9 y:9 x:1 y:9


谁能解释一下为什么最后一个console.log打印的是9而不是1。

因为x和y是独立的实例。可以将同一实例设置为变量x和y

<script>

function Foo() {

}

Foo.prototype = {
    a: 9
};

var x = new Foo();
var y = x;
// the same is:
// var x, y;
// x = y = new Foo();

console.log('x : ' + x.a + '\n');
console.log('y : ' + y.a + '\n');

x.a = 1;

console.log('x : ' + x.a + '\n');
console.log('y : ' + y.a + '\n');


</script>

函数Foo(){
}
Foo.prototype={
a:9
};
var x=新的Foo();
变量y=x;
//同样是:
//变量x,y;
//x=y=newfoo();
console.log('x:'+x.a+'\n');
console.log('y:'+y.a+'\n');
x、 a=1;
console.log('x:'+x.a+'\n');
console.log('y:'+y.a+'\n');

因为x和y是独立的实例。可以将同一实例设置为变量x和y

<script>

function Foo() {

}

Foo.prototype = {
    a: 9
};

var x = new Foo();
var y = x;
// the same is:
// var x, y;
// x = y = new Foo();

console.log('x : ' + x.a + '\n');
console.log('y : ' + y.a + '\n');

x.a = 1;

console.log('x : ' + x.a + '\n');
console.log('y : ' + y.a + '\n');


</script>

函数Foo(){
}
Foo.prototype={
a:9
};
var x=新的Foo();
变量y=x;
//同样是:
//变量x,y;
//x=y=newfoo();
console.log('x:'+x.a+'\n');
console.log('y:'+y.a+'\n');
x、 a=1;
console.log('x:'+x.a+'\n');
console.log('y:'+y.a+'\n');

写下你期望的东西。

x.a=1不会更改prototype属性。它只是给
x
分配了一个新的“local”属性,该属性与原型上定义的属性相比较

x.a === 1; //true because x.a === 1;
y.a === 9; //true because y.__proto__.a === 9;
Foo.prototype = { a: 1 };
var x = new Foo(); // x.a === 1
var y = new Foo(); // y.a === 1
您可以使用
Foo.prototype.a=1更改prototype属性。但我要说的是:这种原型的使用至少是不常见的。通常,原型包含方法,而不是实例之间共享的属性。对象的属性,通常在实例本身上定义。定义(或模拟)静态属性的一种常见方法如下:

Foo.a = 9;

然后,每次您想使用或更改它时,只需参考
Foo.a

x.a=1不会更改prototype属性。它只是给
x
分配了一个新的“local”属性,该属性与原型上定义的属性相比较

x.a === 1; //true because x.a === 1;
y.a === 9; //true because y.__proto__.a === 9;
Foo.prototype = { a: 1 };
var x = new Foo(); // x.a === 1
var y = new Foo(); // y.a === 1
您可以使用
Foo.prototype.a=1更改prototype属性。但我要说的是:这种原型的使用至少是不常见的。通常,原型包含方法,而不是实例之间共享的属性。对象的属性,通常在实例本身上定义。定义(或模拟)静态属性的一种常见方法如下:

Foo.a = 9;

然后,每次您想要使用或更改它时,只需参考
Foo.a

您只是在对象的一个实例('x')上更改a属性,而不是在原型上

x.a === 1; //true because x.a === 1;
y.a === 9; //true because y.__proto__.a === 9;
Foo.prototype = { a: 1 };
var x = new Foo(); // x.a === 1
var y = new Foo(); // y.a === 1
为了使原型继承起作用,您必须在原型对象本身上设置它,然后两个实例都将发生更改

    <script>

    function Foo() {

    }

    Foo.prototype = {
        a: 9
    };

    var x = new Foo(); // x.a === 9
    var y = new Foo(); // y.a === 9

    console.log('x : ' + x.a + '\n'); // === x: 9
    console.log('y : ' + y.a + '\n'); // === y: 9

    x.a = 1; // changed only for the 'x' instance

    console.log('x : ' + x.a + '\n'); // === x: 1, because you changed it
    console.log('y : ' + y.a + '\n'); // y: 9, because it inherited from the prototype.

</script>

修改对象的实例不会修改原始对象的原型,只会修改它的特定实例。

您只是在对象的一个实例(“x”)上更改a属性,而不是在原型上更改

x.a === 1; //true because x.a === 1;
y.a === 9; //true because y.__proto__.a === 9;
Foo.prototype = { a: 1 };
var x = new Foo(); // x.a === 1
var y = new Foo(); // y.a === 1
为了使原型继承起作用,您必须在原型对象本身上设置它,然后两个实例都将发生更改

    <script>

    function Foo() {

    }

    Foo.prototype = {
        a: 9
    };

    var x = new Foo(); // x.a === 9
    var y = new Foo(); // y.a === 9

    console.log('x : ' + x.a + '\n'); // === x: 9
    console.log('y : ' + y.a + '\n'); // === y: 9

    x.a = 1; // changed only for the 'x' instance

    console.log('x : ' + x.a + '\n'); // === x: 1, because you changed it
    console.log('y : ' + y.a + '\n'); // y: 9, because it inherited from the prototype.

</script>

修改对象的实例不会修改原始对象的原型,只会修改该对象的特定实例。

可能的重复项您没有修改y-添加
y.a=1
下面
x.a=1
可能的重复项您没有修改y-添加
y.a=1
下面
x.a=1
如何更改属性“a”在prototype上定义?@CleanCrispCode在我解释的地方查看我的答案,但如果更改实例值,它只会影响该实例。如果要更改所有实例,则需要编辑原型定义。如何更改在原型上定义的属性“a”@CleanCrispCode请参见我的解释,但如果更改实例值,则只会影响该实例。如果你想更改所有实例,你需要编辑原型定义。明白了。既然@basilikum首先回答了问题,我正在标记他的答案。。谢谢。明白了。既然@basilikum先回答了,我就给他打分。。谢谢