给实例直接赋值,会依据原型链依次向上查找
fun per() {}
per.prototype.name = [1,2]
var per1 = new per();
consoloe.log(per1.name) //[1,2]
per1.name.push(3) //per1.name ==per.prototype.name [1,2,3]
per1.name = 18 //per1.name不等于per.prototype.name
继承:基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法,实现方式,让一个原型对象等于另一个类型的实例
注意:通过原型链实现继承的时候,不要使用对象字面量创建原型方法,因为这样会重写原型链
affunction per(){ this.pro = true;} per.prototype.getpro = function() {return this.pro;}; function per2(){this.pro2 = false;} per2.prototype = new per();//继承了per per2.prototype.getpro2 = function() {return this.pro2;}; var per3 = new per2(); per3.getpro2()false per3.getpro()true
new 操作符,以这种方式调用构造函数实际上经历以下4个步骤
1创建一个新对象
2将构造函数的作用域赋给新对象(因此this就指向了这个新对象)
3执行构造函数中的代码(为这个新对象添加属性)
4返回新对象
当为对象实例添加一个属性时,只会阻止我们访问原型中的那个属性,但不会修改那个属性(注意是基本类型),如果要访问原型的属性,通过delete删除实例的属性
原型对象的问题
1省略了为构造函数传递初始化参数这一环节,导致所有实例在默认情况下都取得相同的属性值,会有一些 不方便,但不是最大问题
2最大问题是其共享的本性导致的,对于引用类型值的属性来说,问题比较突出
function Person() {} Person.prototype={ name:'haha', age:29, friends:['lily','hanlei'], sayName: function(){aalert(this.name);} } var per1 = new Person(); var per2 = new Person(); per1.friends.push('van'); alert(per1.friends);//lily,hanlei,van alert(per2.friends);//lily,hanlei,van alert(per1.friends == per2.friends);//true
解决方法
组合使用构造函数模式和原型模式,原型中的属性为引用类型的时候不会发生改变
function Per(name, age, job){ this.name = name; this.age = a ge; this.job = job; this.friends = ['lily', 'lucy']; } Person.prototype = { constructor:Person; sayName: function(){ alert(this.name); } }; var per1 = new Person('jim', '29', 'enjineer'); var per2 = new Person('greg', '27', 'doctor'); per1.friends.push('van'); alert(per1.friends);//lily,lucy,van alert(per2.friends);//lily,lucy alert(per1.friends == per2.friends);//false alert(per1.sayName == per2.sayName);//true