对象2——《javascript高级程序设计》读书笔记
——>创建对象
1:工厂模式:将创建对象的过程用函数进行包装,之后对函数进行调用便可以创建实例对象
function createPerson(name,age,job) { var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function() { alert(this.name); }; return o; } var person1 = createPerson("waiting_h","20","student"); var person2 = createPerson("william","29","star");
2:构造函数模式:与上述工厂模式的不同之处在于——没有显式的创建对象;直接将属性和方法赋给了this对象;没有return语句;创建实例对象时需要使用new操作符。
function Person(name,age,job) { this.name = name; this.age = age; this.job = job; this.sayName = function() { alert(this.name); }; } var person1 = new Person("waiting_h","20","student"); var person2 = new Person("william","29","star");
当然,为了避免构造函数内部的函数在每次实例化时都要创建(毕竟函数也是对象),可以将内部函数拿出来定义,在内部用赋值的方法进行引用,这样一来,多个实例对象中的该属性都指向同一个函数。而不是像之前每次都要创建时,每个实例对象中该属性都有一个函数副本。
此时,对于构造函数模式,我们应该来关注一下new操作符:
——new操作符:使用new操作符会经历如下步骤:
——创建一个新对象;
——将构造函数的作用域赋给新对象(即this指向该新对象);
——执行构造函数中的代码(为新对象添加属性);
——返回新对象。
3:原型模式:
funtion Person() {} Person.prototype.name = "waiting_h"; Person.prototype.age = 20; Person.prototype.job = "student"; Person.prototype.sayName = function() { alert(this.name); }; var person1 = new Person();
———原型对象:包含可以由特定类型的所有实例共享的属性和方法。
我们在创建一个函数时,与此同时会自动生成该函数的一个prototype属性,该属性指向原型对象,可通过构造函数的该属性来添加原型对象的属性,而原型对象在被创建的同时也自动生成一个constructor属性,该属性指向原prototype属性所在的函数。
另外,在我们调用构造函数创建实例对象时,该实例对象内部包含一个属性[[Prototype]](ECMAScript 5)用来指向构造函数的原型对象。
so:实例对象和构造函数之间没直接关系。
当然,原型属性有一个很大的弊端——由原型模式创建的实例属性拥有相同的属性方法,对于此弊端,我们可以利用实例属性来添加自己独特的属性,即使和原型对象中的属性重名,它也会屏蔽原型对象中的属性,因为查找某个实例属性时,是从实例本身开始,若没找到才会去原型对象中查找。
一般在使用时我们会比较青睐于构造函数模式和原型模式结合使用:构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性。
function Person(name,age,job) { this.name = name; this.age = age; this.job = job; this.friends = ["BigLun","William"]; } Person.prototype = { constructor : Person; sayName : function() { alert(this.name); } } var person1 = new Person("waiting_h",20,"student");
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。