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操作符创建过程

  1. 创建一个新对象
  2. 将this指向这个新对象
  3. 执行构造函数中代码(为这个新对象添加属性)
  4. 返回新对象

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);
}

这种也存在问题,对象需要定义多个属性时,就要定义很多全局对象,没有封装性可言了。

posted @ 2012-06-16 23:49  zzu-han  阅读(212)  评论(0编辑  收藏  举报