JS 封装 - 83015010/js GitHub Wiki

参考资料:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html

一、构造函数实现对象的封装

    //定义一个人的构造函数
    function Person(name,age) {
        this.name = name;
        this.age = age;
    }

    var zhangsan  = new Person('zhangsan',22);
    var lisi =  new Person('lisi',25);

1.1 构造函数中的this指向函数的实例对象

1.2 每一个实例对象都有一个constructor属性,它指向函数本身

console.log(zhangsan.constructor == Person); // true

console.log(lisi.constructor == Person); // true

1.3 构造函数的prototype属性

我们可以将某个原型对象的共同属性挂在prototype上,这样每一个实例对象都会拥有该属性。

   //定义一个人的构造函数
    function Person(name, age) {
        this.name = name;
        this.age = age;
    }

    //假设每个人都有说话的能力,做自我介绍
    Person.prototype.speak = function () {
        console.log('我叫: '+this.name+' , 我今年: '+this.age+'岁');
    }

    var zhangsan = new Person('zhangsan', 22);
    var lisi = new Person('lisi', 25);

    //每一个实例对象都拥有了speak方法
    zhangsan.speak();
    lisi.speak();

输出:

我叫: zhangsan , 我今年: 22岁
我叫: lisi , 我今年: 25岁

1.4 prototype的一些方法

1.4.1 isPrototypeOf()

这个方法用来判断,某个proptotype对象和某个实例之间的关系。

    console.log(Person.prototype.isPrototypeOf(zhangsan)); //true
    console.log(Person.prototype.isPrototypeOf(lisi));//true

1.4.2 hasOwnProperty

每个实例对象都有一个hasOwnProperty()方法,用来判断某一个属性到底是实例对象自己的属性,还是继承自prototype对象的属性。

    console.log(zhangsan.hasOwnProperty('name'));//true
    console.log(zhangsan.hasOwnProperty('speak'));//false

1.4.3 in 运算符

in运算符可以用来判断,某个实例是否含有某个属性,既包含实例对象自己的属性,也包含prototype继承的属性。

所以使用in遍历对象的时候,得到的是该对象的所有属性