对象(一)
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