JS中对象的建立

1 工厂模式

function Person(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 =Person("Nicholas", 29, "Software Engineer");

2 构造函数模式

function Person(name, age, job){
            this.name = name;
            this.age = age;
            this.job = job;
            this.sayName = function(){
                alert(this.name);
            };    
        }
创建对象实例

var person1=new Person("Jim",29,"manage");

使用构造函数的主要问题是每个方法都要在每个实例上重新创建一遍

3 原型模式

每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象(原型对象),而这个对象的用途就是包含可以由特定类型的所有实例共享的属性和方法,并且该对象会自动获得constructor属性,constructor属性包含一个指向prototype属性所在函数的指针。

function Person(){
        }
        
        Person.prototype.name = "Nicholas";
        Person.prototype.age = 29;
        Person.prototype.job = "Software Engineer";
        Person.prototype.sayName = function(){
            alert(this.name);
        };
        
创建对象实例

        var person1 = new Person();
        person1.sayName();   //"Nicholas"

为减少不必要的输入(Person.prototype),用一个包含所有属性和方法的对象字面量来重写整个原型对象
<pre name="code" class="javascript">function Person(){}
Person.prototype={
name:"Nicholas",
age:29,
job:"Software Engineer",
sayName:function(){
alert(this.name);
}
};

 但是该语法本质上完全重写了默认的prototype对象,因此constructor属性也就变成了新对象的constructor属性(指向Object构造函数),不在指向Person函数。可以像下面这样特意将它设置回适当的值 

function Person(){
        }
        
        Person.prototype = {
            constructor : Person,
            name : "Nicholas",
            age : 29,
            job: "Software Engineer",
            sayName : function () {
                alert(this.name);
            }
        };
原型中的所有属性是被很多实例共享的,这种共享对函数非常适合,对于包含基本只的属性可以通过在实例上添加一个同名属性改变属性的值,但是对于包含引用类型值(如数组)的属性来说,因为改变一个对象实例的值,其他对象实例的值也随之改变。所以很少有人单独使用原型模式

4 组合使用构造函数模式和原型模式

创建自定义类型的最常见模式,就是组合使用构造函数模式与原型模式。构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。

function Person(name, age, job){
            this.name = name;
            this.age = age;
            this.job = job;
            this.friends = ["Shelby", "Court"];
        }
        
        Person.prototype = {
            constructor: Person,
            sayName : function () {
                alert(this.name);
            }
        };



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值