对象(一)

1、工厂模式
function createPerson(name,age,sex) {
        var obj = new Object();
        obj.name = name;
        obj.age = age;
        obj.sex = sex;
        obj.sayName = function () {
            alert(this.name)
        }
        return obj;
    }

    var p1 = createPerson("张三",20,"")
    var p2 = createPerson("李四",22,"")

2、构造函数模式

函数的第一个字母大写,表示该函数为构造函数,可以通过 new 方法进行实例化对象
function Person(name,age,sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.sayName = function () {
            alert(this.name);
        }
    }
    // 实例化对象时,每个对象都将创建一个 sayName 的方法,因此每个对象的 sayName 方法都不相同
    var p3 = new Person("王五",23,"");
    var p4 = new Person("赵六",24,"")
    alert(p3.sayName == p4.sayName)         // false

由于实例化对象时,每个对象都将创建一个 sayName 的方法,因此每个对象的 sayName 方法都不相同,所以效率相对较低,改进方法一 :

function Person2(name,age,sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.sayName = sayName;
    }
    function sayName() {
        alert(this.name);
    }

    var p5 = new Person2("周周",32,"");
    var p6 = new Person2("屋五",22,"");
    alert(p5.sayName == p6.sayName);        // true

此时,创建的所有对象将共用一个 sayName 方法,但是该方法还有个缺点,就是创建了一个全局的 sayName 函数,效率也是比较低下

改进方法二,使用 原型的方法:

function Person3(name,sex) {
        this.name = name;
        this.sex = sex;
    }
    var obj = Person3.prototype;
    obj.age = 26;
    obj.sayName = function () {
        alert(this.name);
    }
    var p7 = new Person3("真真","")
    var p8 = new Person3("望望","")
    alert(p7.age)                       // 26
    alert(p7.sayName == p8.sayName)     // true
    alert(obj.isPrototypeOf(p7)) 

注意 :   构造函数.prototype = 原型对象

    原型对象.constructor = 构造函数

isPrototypeOf  
obj.isPrototypeOf(p7) 判断 p7 的原型是不是 obj
posted @ 2017-11-07 11:01  linfang.zhou  阅读(140)  评论(0编辑  收藏  举报