把属性和函数封装成一个对象,然后从原型对象生成实例对象
原始模式
构造函数模式
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对象上:
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