理解JS封装

1399 查看

把属性和函数封装成一个对象,然后从原型对象生成实例对象

  • 原始模式

  • 构造函数模式

  • prototype模式

原始模式

var Person = {
    name: "",
    age: ""
};

根据上述规格生成实例:

var p1 = {
    name: "Oliver",
    age: 18
};
var p2 = {
    name: "Troy",
    age: 24
};

或者写一个函数直接返回对象的实例:

function Person(name, age) {
    return {
        name: name,
        age: age
    };
}
var p1 = Person("Oliver", 18);
var p2 = Person("Troy", 24);

该方法的问题是没有建立实例之间的关系

构造函数模式

this配合new操作符,将this绑定在实例对象上:

function Person(name, age) {
    this.name = name;
    this.age = age;
}
var p1 = new Person("Oli", 18);
var p2 = new Person("Tro", 24);

实例的constructor属性将指向构造函数:

console.log(p1.constructor); //Person(){}

instanceof运算符检验是否为该原型对象的实例:

console.log(p1 instanceof Person); //True

该方法会重复占用内存

prototype模式

可以把重复的,不变的属性和方法(就是共有的,不是私有的)放在原型的prototype对象上:

function Person(name, age) {
    this.name = name;
    this.age = age;
}
Person.prototype.sayName = function() {
    console.log(this.name);
};
Person.prototype.nationality = "Chinese";
var p1 = new Person("Oli", 18);
var p2 = new Person("Tro", 24);
p2.sayName(); //Tro
console.log(p1.nationality); //Chinese