Javascript对象与继承

标识符指变量,函数,属性的名字,或者函数的参数;
对象是引用类型的值,是引用类型的一个实例;引用类型是一种数据结构;
所有引用类型默认都继承自Object类型,所有对象都继承自Object(JS高程);

创建对象的方式

1.工厂模式

原理:在普通函数中创建一个对象,通过函数传参至对象内,返回对象;调用函数即可返回一个对象;
缺点:没有对象识别,及没有对象类型;
例子:

//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("Nicholas",29,"Software Engineer");
var person2 = createPerson("Greg",27,"Doctor");

2.构造函数模式

原理:
使用new操作符调用构造函数;
将构造函数的作用域赋给新对象(this指向新对象);
构造函数内部通过参数和this为新对象添加属性;
返回新对象;
缺点:每个实例对象的方法不是同一个Function实例;若将方法定义为全局函数又无任何封装性可言;
例子:

//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("Nicholas",29,"Software Engineer");
    var person2 = new Person("Greg",27,"Doctor");
}

3.原型模式

原理:
定义构造函数
通过函数的prototype指针修改原型对象中的属性和方法
缺点:所有属性在原型对象中修改,导致所有属性被所有实例共享;

//3.原型模式
function Person(){
}
Person.prototype = {
    name:"Nicholas",
    age:29,
    job:"Software Engineer",
    sayName:function(){
        alert(this.name);
    }
};
var person1 = new Person;
var person2 = new Person;
person1.sayName();//"Nicholas"
person2.sayName();//"Nicholas"
alert(person1.sayName == person2.sayName)//true

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);
    }
}
var person1 = new Person("Nicholas",29,"Software Engineer");
var person2 = new Person("Greg",27,"Doctor");
person1.friends.push("Van");
alert(person1.friends);//"Shelby,Count,Van"
alert(person2.friends);//"Shelby,Count"
alert(person1.friends === person2.friends);//false
alert(person1.sayname === person2.sayname);//true

5.动态原型模式

暂时不理解

6.寄生构造函数模式

原理:
同工厂模式的函数相同;
调用时使用new通过构造函数创建对象;
由于在构造函数中返回了一个对象,因此构造函数本身不需要再返回实例;即重写了调用构造函数时返回的值;
因此,构造函数返回的对象与构造函数原型没有关系;
优点:
给已有的对象添加方法并返回,为新对象创建构造函数,比如创建一个具有额外方法的数组;
缺点:
返回的对象与构造函数原型没有任何关系,因为在构造函数中返回了对象重写调用构造函数时本应该返回的值;
例子:

function SpecialArray(){
    //创建数组
    var values = new Array();
    //添加值
    values.push.apply(values,arguments);
    //添加方法
    values.toPipedString = function(){
        return this.join("|");
    };
    //返回数组
    return values;
}
var colors = new SpecialArray("red","blue","green");
alert(colors.toPipedString());

7.稳妥构造函数模式

原理:
在函数中创建一个对象;
在函数中定义一个方法访问其中的属性;
返回对象;
调用时不使用new,通过普通函数返回对象;
优点:除在函数中定义的方法外,没有其他方法可以访问属性,安全;
例子:

function Person(name,age,job){
    var o = new Object();
    o.sayName = function(){
        alert(name);
    }
    return o;
}
var friend = Person("Nicholas",29,"Software Engineer");
friend.sayName();//"Nicholas"

继承

1.原型链

2.借用构造函数

3.组合继承

4.原型式继承

5.寄生式继承

6.寄生组合式继承

普遍式方式,需要时再整理,未完。
–整理自《Javasctipt高级程序设计》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值