Function.prototype Javascript
下面是我为理解Function.prototype而编写的示例JS代码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');
<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先回答了,我就给他打分。。谢谢