javascript 设计模式二:构造函数
1-1 构造函数入门
Object和Array是原生构造函数,在运行时会自动出现在执行环境中。
同时,也可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法。例:
function Person(name, age, job){ this.name = name; this.age = age; this.job = job; this.sayName = function(){ alert(this.name); } } var person1 = new Person("han",22,"designer"); var person2 = new Person("yang",23,"market sell"); person1.sayName(); // "han" person2.sayName(); // "yang"
这里直接将属性和方法赋给了this对象。
这里函数名Person以大写P开头,这里借鉴其他OO语言,为了区别ECMAScript中其他函数,因为构造函数本身也是函数。
1-2 new操作符创建过程
- 创建一个新对象
- 将this指向这个新对象
- 执行构造函数中代码(为这个新对象添加属性)
- 返回新对象
1-3 对象检测
new创建的对象都有一个constructor(构造函数)属性,这里指向Person
alert(person1.constructor == Person); // true alert(person2.constructor == Person); // true
alert(person1.constructor == Object); //fals
instanceof操作符来对象检测会更可靠一些,另所有对象都是Object的实例
alert(person1 instanceof Object); //true alert(person1 instanceof Person); //true
1-4 构造函数与普通函数区别
构造函数与普通函数的写的样式都一样,区别在于调用方式不同。
只要通过new操作符来调用,它就可以构造函数,而任何函数不通过new操作符调用,那么它跟普通函数也不会有什么两样。
1 // 当做构造函数使用 2 var person = new Person("han",22,"designer"); 3 person.sayName(); 4 5 // 作为普通函数调用 6 Person("Geogre",22,"designer"); //添加到window 7 window.sayName(); 8 9 // 在另一个对象作用域中调用 10 var o = new Object(); 11 Person.call(o,"Kisen",28,"Nurse"); 12 o.sayName();
注:对第二个调用解释,在全局作用域调用一个函数时,this对象总是指向Global对象(在浏览器中是window对象)
2-1 构造函数问题
在Prototype原型中也讨论过,通过构造函数模式创造的对象都拥有各自的属性,没有公用可言
alert(person1.sayName == person2.sayName) // false;
解决方案:
function Person(name, age, job){ this.name = name; this.age = age; this.jbo = job; this.sayName = sayName; } function sayName(){ alert(this.sayName); }
这种也存在问题,对象需要定义多个属性时,就要定义很多全局对象,没有封装性可言了。