创建对象 20170223 am

1、工厂模式

用函数封装。

function  creatPerson(name,age,job){

var  0  =  new  Object();

o.name = name;

o.age = age;

o.job = job;

o.sayName = function(){

alert(this.name);

};

return o;

}

var  person1 = creatPerson("tfs",5,"singer");

var  person2 =  creatPerson("tfr",6,"painter");

优点:创建了person对象,可以无数次调用。

缺点:无法知道对象的类型。

2、构造函数模式。

function  Person(name,age,job){

this.name = name;

this.age = age;

this.job = job;

this.sayName = sayName;

};

function sayName(){
alert(this.name);

};

var  person1 =new  Person("tfs",5,"singer");

var  person2 =new   Person("tfr",6,"painter");

检测对象类型:instanceof

缺点:每个成员无法复用。

3、原型模式。

prototype

[[prototype]]

constructor:每创建一个函数,就会同时创建它的prototype对象,这个对象 会自动获得constructor属性。

hasOwnProperty():实例定义该属性才返回true。

如:var  person1 =new Person();

      person1.name = "tfs";

     alert(person1.hasOwnProperty("name"));  //true


in:对象能访问给定属性时返回true,与该属性在实例中还是原型中无关。alert("name"  in person1);  //true

for-in循环:返回所有对象可以访问的,可枚举的属性。

hasPrototypeProperty():属性在原型中则返回true。alert(hasPrototypeProperty(person,"name"));

Object.keys():取得所有可枚举的实例属性。var  keys = Object.keys(Person.prototype);  alert(keys);  //"name"

Object.getOwnPropertyNames():可获得所有实例属性,无论是否可枚举。

原型的动态性:

function  Person(){}

var  friend  = new  Person();

Person.prototype = {

constructor:Person;  //用字面量的形式创建新对象,若不指定constructor,将不再指向Person。

name:"tfs";

age:5;

}

alert(friend.name);  //error



原型对象缺点:所有实例共享一个数组。

function  Person(){}

Person.prototype = {

constructor:Person;

name:"tfs";

age:5;

friends:["1","2"];

};

var person1 = new Person();

var person2 = new Person();

person1.friends.push("3");

alert(person1.friends);  //"1,2,3"

alert(person2.friends);  //"1,2,3"。会发现所有实例共享一个数组。

4、构造函数+原型模式

function  Person(name,age,job){

this.name = name;

this.age = age;

this.job = job;

this.friends =["1","2"] ;

};

Person.prototype ={

constructor:Person;

sayName:function(){

alert(this.name);

}

}

var person1 = new Person();

var person2 = new Person();

person1.friends.push("3");

alert(person1.friends);  //"1,2,3"

alert(person2.friends);  //"1,2"

alert(person1.sayName===person2.sayName);  //true

5、动态原型模式

function  Person(name,age,job){

this.name = name;

this.age = age;

this.job = job;

if(typeof  this.sayName != "function"){  //只在 sayName()方法不存在时,才把它添加到原型里。

Person.propotype.sayName = function(){

alert(this.name);

}

}

var  person =new  Person("tfs",5,"singer");

person.sayName();

6、寄生构造函数模式

7、稳妥构造函数模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值