在调用构造函数时会为实例添加一个指向最初原型的指针,我们可以随时为原型添加属性和方法,并且能在实例中体现出来,但如果是重新了原型对象,那就会切断构造函数与最初原型的联系。
function Dog () { } var friend = new Dog(); Dog.prototype ={ constructor : Dog, name : "Bob", age : 11, jump : function () { alert("跳一下"); } }; friend.jump(); //error
这里原型对象在创建Dog实例后重写,所以friend指向的原型中不包含jump().
在这里进行重写的部分有很多属性是可以共享的,例如name、age。当我们修改其中一个实例的属性时,其他实例也会受到影响,这样并不是我们想要的。所以在创建的时候常常使用构造函数与原型模式的组合。
构造函数模式定义实例属性,原型模式定义方法和共享属性。
function Dog (name,age,breed) { this.name = name; this.age = age; this.breed = breed; this.friends = ["Ange","Array"]; } Dog.prototype ={ constructor : Dog, jump : function () { alert("跳一下"); } }; var dog1 = new Dog("Bob","5","Shiba"); var dog2 = new Dog("Amy","2","Alaska"); dog1.friends.push("Edit"); console.log(dog1.friends); //["Ange", "Array", "Edit"] console.log(dog2.friends); //["Ange", "Array"]