javascript原型的替代方案(或相同?)
我想了解javascript中的原型设计。 例如: 1) 2)javascript原型的替代方案(或相同?),javascript,prototype,Javascript,Prototype,我想了解javascript中的原型设计。 例如: 1) 2) 我得到的obj1和obj2是一样的。那么,我在2)中所做的也是原型?还是不?关于prototype,我遗漏了什么?obj1和obj2略有不同,我将快速解释一下JavaScript中的prototype继承 原型是一个对象,就像任何其他对象一样 每个具有原型的对象都将从中继承所有属性和方法,如果它们已经在对象中定义,则会覆盖它们。原型引用是活动的,这意味着,无论何时修改作为另一个对象原型的对象,更改都会反映在该对象中 您使用的是伪经典
我得到的obj1和obj2是一样的。那么,我在2)中所做的也是原型?还是不?关于prototype,我遗漏了什么?obj1和obj2略有不同,我将快速解释一下JavaScript中的prototype继承 原型是一个对象,就像任何其他对象一样 每个具有原型的对象都将从中继承所有属性和方法,如果它们已经在对象中定义,则会覆盖它们。原型引用是活动的,这意味着,无论何时修改作为另一个对象原型的对象,更改都会反映在该对象中 您使用的是伪经典继承方法,即定义一个
构造函数
函数,该函数将返回“类”的实例。该类的所有实例都将在以下位置定义对象作为其原型对象:Constructor.prototype
,您可以向该原型添加方法或属性,这些方法或属性将添加到“类”的每个实例中
为什么obj1和obj2不同
obj1不直接引用fn
方法,而是引用原型,原型有方法,因此obj1也有方法
obj2直接引用方法,这意味着它是对象的自有属性
您可以通过更改原型的方法来更改obj1的fn方法,MyObject的任何其他实例(如obj1)也将更改
但在obj2中不能这样做,如果修改obj2的方法,只需替换该实例的方法
我希望你有所收获,如果你有任何疑问,尽管问
关于编写“类”:JavaScript没有类,它用原型模拟类继承,您可以使用对象使用原始原型继承。创建,您会发现它更简单。2)不是原型化
下面是一个简单的示例,解释了两种方法的区别:
1)
在这里,您可以在创建obj1
后更改prototype对象,但是此更改会影响对象,因为它引用了当前prototype对象
因为obj2
也有一个对原型对象的引用,所以通过调用函数fn
也可以得到“2”
此处所有实例共享同一原型对象。
2)
这里每个对象都有自己的fn
功能。如果一个对象更改了函数,它只会影响当前对象。假设我们有
var A = new Object1(),
B = new Object1(),
X = new Object2(),
Y = new Object2(),
fn2 = function () {
console.log(2);
};
考虑(为每个重置)
A.fn===B.fn;//正确
X.fn==Y.fn;//错误
Object1.prototype.fn=fn2
thenA.fn();//2
Object2.prototype.fn=fn2
但是X.fn();//1
A.fn=fn2
nowA.fn();//2
butB.fn();//1
X.fn=fn2
nowX.fn();//2
但Y.fn();//1
“fn”在A中;//正确
但A.hasOwnProperty(“fn”);//错误
“fn”在X中;//true
和X.hasOwnProperty(“fn”);//正确
我们能从中学到什么?
原型化在实例之间共享,但不直接在实例上设置属性,而在构造函数中设置属性每次都会创建新的和单独的属性。只需将MyObject.prototype
想象为一个对象,它由从MyObject
构造函数创建的所有对象共享。因此,即使您从MyObject
创建了1000个新对象,它们都将共享(继承).prototype
对象的所有属性。感谢所有评论和回答+1.我必须选择一个作为答案。原型是共享的,这个.fn是为每个实例创建的。有关原型和继承的更多信息,请参见此处:
var MyObject = function() {
this.a = "a";
this.fn = function() {console.log('1');}
return this;
}
var obj2 = new Object2();
var MyObject1 = function() {
this.a = "a";
return this;
}
MyObject1.prototype.fn = function() {console.log('1');}
var obj1 = new MyObject1();
// change the prototype again
MyObject1.prototype.fn = function() {console.log('2');}
var obj2 = new MyObject1();
obj1.fn(); // logs '2'
obj2.fn(); // logs '2'
var MyObject2 = function() {
this.a = "a";
this.fn = function() {console.log('1');}
return this;
}
var obj3 = new MyObject2();
// change the function
obj3.fn = function() {console.log('2');}
var obj4 = new MyObject2();
obj3.fn(); // logs '2'
obj4.fn(); // logs '1'
var A = new Object1(),
B = new Object1(),
X = new Object2(),
Y = new Object2(),
fn2 = function () {
console.log(2);
};