Javascript OOP 笔记

创建对象


工厂模式

    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function(){
        alert(this.name)
    };
    return 0;
}

var person1 = createPerson("xiaohong",13,"ji");
var person2 = createPerson("xiaoming",16,"ya");

//*工厂模式的缺点是 没有解决对象识别问题(即怎么知道一个对象的类型)


构造函数模式

function Person(name,age,job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = New Function("alert(this.name)")
}

var person1 = new Person("xiaohong",13,"ji");
var person2 = new Person("xiaoming",16,"ya");

//用new操作符创建新实例.步骤有以下4点
//
1)创建一个新对象
//2)将构造函数赋的作用域赋值给新对象(this指向新对象)
//
3)执行构造函数代码(为新对象添加属性)
//4)返回新对象
//
构造函数与其他函数的区别是,调用它们的方法不同而已(用new调用的函数就会变成构造函数)


原型模式

function Person(){ }

Person.prototype.name = "xiaohong"
Person.prototype.age = 13
Person.prototype.job = "ji"
Person.prototype.sayName = function() {
    alert(this.name)
}

var person1 = new Person()
person1.sayName() //"xiaohong"
var person2 = new Person()
person2.sayName() //"xiaohong"

//*实例在没有重写的情况下只有其实例化对象的原型一个属性.如下

alert(person1.name) //"xiaohong" --来自原型
person1.hasOwnProperty("name") //false
person1.name = "xiaoming"
alert(person1.name) //"xiaoming" --来自实例
person1.hasOwnProperty("name") //true

//调用构造函数时会为实例添加一个指向最初原型的指针.当原型修
//改为另一个对象时就等于切断了构造函数与最初原型型之间的练习
//
如下:

function Person(){ }
var friend = new Person()
Person.prototype = {
    constructor:Person,
    name : "xiaohong",
    age : 13,
    job : "ji",
    sayName: function(){
        alert(this.name)
    }
}
friend.sayName() //error

//原型的缺点是共享数据.当向实例引用的原型属性数组中添加元素
//会直接添加到原型从而改变所有的实例的值
//
如下

function Person(){  }
Person.prototype = {
    name : "xiaohong",
    age : 13
    friends : ["xiaoming","xiaogang"],
    sayName : function () {...}
}
var person1 = new Person();
var person2 = new Person();

person1.friends.push("daming")

alert(person1.friends) //"xiaoming,xiaogang,daming"
alert(person2.friends) //"xiaoming,xiaogang,daming"

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

//*构造函数定义实例属性;原型定义共享方法和共享属性

function Person(){
    this.name = name
    this.age = age
    this.job = job
    this.friends = ["daming","xiaogong"]
}

Person.prototype = {
    construtor: Person,
    sayName: function(){
        alert(this.name)
    }
}

var person1 = new Person("xiaohong",13,"ji");
var person2 = new Person("xiaoming",16,"ya");

person1.friends.push("laowang")
alert(person1.friends) // "daming,xiaogang,laowang"
alert(person2.friends) // "daming,xiaogang"
alert(person1.friends === person2.friends) // false
alert(person1.sayName === person2.sayName) // true

相关文档

MDN ,Javascript高级程序设计

你可能感兴趣的:(Javascript OOP 笔记)