在下面的代码中,
ColVarId
如果使用构造函数function Person(first, last, age) {
this.firstName = first;
this.lastName = last;
this.age = age;
}
Person.prototype.planet = "Earth";
p1 = new Person("David", "Beckham", 39);
p2 = new Person("Lionel", "Messi", 30);
创建了多个实例p1
p2
,那么
如何理解属性Person
与属性planet
的区别?通过在构造函数age
中将planet
添加为this.planet
会有什么不同?
注意:了解Person
属性
答案 0 :(得分:4)
考虑在未来时我们要改变所有实例共享的原型属性的情况
function Person(first, last, age) {
this.firstName = first;
this.lastName = last;
this.age = age;
}
Person.prototype.planet = "Earth";
p1 = new Person("David", "Beckham", 39);
p2 = new Person("Lionel", "Messi", 30);
console.log(p1.planet) // Earth
Person.prototype.planet = "Mars"
console.log(p1.planet) // Mars
console.log(p1.planet === p2.planet) // true
更改原型上的一个属性将在所有实例中更改它
答案 1 :(得分:2)
原型属性将是从所谓的原型创建的任何对象的一部分,这包括原型链。
实例属性将是整个实例的一部分,在您的情况下,它将是任何实例的一部分,因为您在构造函数中添加它:
function A() {
this.x = 11;
}
var instance = new A();
instance.x = 11;
以上两种情况都是将属性添加到自己的对象而不是原型中。
此外,为原型添加属性会产生副作用:
function A() {}
A.prototype.x = 11;
function B() {}
B.prototype = Object.create(A.prototype);
var instanceA = new A();
var instanceB = new B();
A.prototype.x = 12;
// Both "x" will hold 12
alert(instanceA.x);
alert(instanceB.x);
所以,在java术语中,age是实例成员,planet是a 静态成员。要定义静态成员,我们使用prototype属性, 我对么? -
这是一个错误的陈述。
原型属性不是静态的,因为原型是常规对象。它只是JavaScript使用原型链来实现继承,它依赖于一个名为prototype
的标准属性。
在JavaScript中没有静态。当您访问任何属性时,JavaScript的运行时将通过原型链查找它:
function A() {};
A.prototype.x = 11;
function B() {};
B.prototype = Object.create(A.prototype);
function C() {};
C.prototype = Object.create(B.prototype);
var instanceC = new C();
var x = instanceC.x;
// Once you request a property "x", the runtime will do the following process:
// 1) Is "x" in the own object? No, then 2)
// 2) Is "x" in current object's prototype? No, then 3)
// 3) Is "x" in the parent prototype? No, then 4)
// 4) And so on, until it reaches the top-level prototype, and if this has no
// "x" property, then runtime will return "undefined"
答案 2 :(得分:2)