js的对象与函数详解(2)

我们创建的每一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,这个对象中包含着所有对象实例的属性和方法,这个对象就是原型对象。通俗的说,原型对象中的方法和属性可以被所有对象的实例所共享,对象实例就不用多次创建相同的方法和属性。

function Person(){ }; Person.prototype={ name:"Tom", age:23, job:"web前端工程师", sayName:function(){ alert(this.name); } } var person1=new Person(); person1.sayName();

js的对象与函数详解

1.工厂函数封装,通过一个函数封装起来

function dianshi (color,size,brand) { var Tv={}; Tv.color=color; Tv.size=size; Tv.brand=brand; Tv.look=function () { alert("看电视"); } Tv.play=function () { alert("玩游戏"); } Tv.dvd=function () { alert("DVD"); } return Tv; } var ds=dianshi("red","30inch","sony"); //alert(typeof ds)//返回object alert(ds.color) var ds1=dianshi("blue","40inch","changh"); alert(ds1["size"])//传递参数

2.构造函数

function Tv(color,size,brand) { this.color=color;//那个对象引用this就代表那个对象 this.size=size; this.brand=brand; this.play=function () { alert("玩游戏"); } this.look=function () { alert("看电视"); } } var sony=new Tv("red","20 inch","sony"); alert(sony.color)

3.prototype方法

共同的属性与方法放在代码段,节省内存空间

function Tv(color,size,brand) { this.color=color; this.size=size; this.brand=brand; this.play=function () { alert("玩游戏"); } } Tv.prototype.look=function () { alert("看电视"); } Tv.prototype.dvd=function () { alert("DVD"); } Tv.prototype.aaa={name:"张三"};//只能共享属性或函数,不能共享对象 var sony=new Tv("red","20 inch","sony"); var changhong =new Tv("red","20 inch","CH"); delete sony.color delete sony.play//undefine delete sony.look//能访问到 sony.look(); changhong.look(); sony.aaa.name="李四"//李四 changhong.aaa.name//李四 全局对象Array扩展增加removeByValue方法 Array.prototype.removeByValue = function(val) { for(var i=0; i<this.length; i++) { if(this[i] == val) { this.splice(i, 1); break; } } }

虽然可以通过对象实例访问保存在原型对象中的值,但却不能通过对象实例重写原型的值。其实对象实例获取某一属性的值是从本身开始寻找,然后是原型对象,最后是构造函数对象,所以重写对象实例的属性值(这个值可以通过delete操作符删除)仅仅是阻断了获取原型属性值的途径,但是没有改变其中的值。

function Person(){ }; Person.prototype.name="Tom"; Person.prototype.age=23; Person.prototype.job="厨师"; Person.prototype.sayName=function(){ alert(this.name); } var person1=new Person(); var person2=new Person(); person1.name="Mike"; alert(person1.name); alert(person2.name); alert(person1.name); alert(person2.name);

4.面向对象创建对象

用面向对象语法表示的时候,原型对象的constructor属性不在指向Person,因为每创建一个函数,同时会创建它的prototype对象,用面向对象语法本质上相当于重写了prototype对象,constructor属性也会变成新对象的constructor属性(这里指向Object)

function Person(){ }; Person.prototype={ constructor:Person, name:"Tom", age:23, job:"厨师", sayName:function(){ alert(this.name); } } var person1=new Person(); var person2=new Person(); person1.name="Mike"; alert(person1.name); alert(person2.name);

原型模式的缺点:因为所以对象实例共享原型对象的方法和属性,但是往往实例都有他自己私有的属性,这时候原型模式就不适用了,所以我们可以混合使用构造函数模式和原型模式。

5.混合方法

组合使用构造函数模式和原型模式结合了构造函数和原型模式的优点,构造函数定义实例的私有属性,原型模式定义共享属性和方法。

function Tv(color,size,brand) { this.color=color; this.size=size; this.brand=brand; this.play=function () { alert("玩游戏"); } Tv.prototype.aaa={name:"张三"}; } Tv.prototype.look=function () { alert("看电视"); } Tv.prototype.dvd=function () { alert("DVD"); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/4738789732e6b92ca6b16c62e3e0221b.html