对象的创建模式
-
Object构造函数模式
var obj = new Object(); obj.name = 'Tom' obj.setName = function(name){this.name=name}
-
对象字面量模式
var obj = { name : 'Tom', setName : function(name){this.name = name} }
工厂模式
function createPerson(name, age) { //返回一个对象的函数===>工厂函数 var obj = { name: name, age: age, setName: function (name) { this.name = name } } return obj } // 创建2个人 var p1 = createPerson('Tom', 12) var p2 = createPerson('Bob', 13)
-
构造函数模式
function Person(name, age) { this.name = name; this.age = age; this.setName = function(name){this.name=name;}; } new Person('tom', 12);
-
构造函数+原型的组合模式
function Person(name, age) { this.name = name; this.age = age; } Person.prototype.setName = function(name){this.name=name;}; new Person('tom', 12);
继承模式
- 原型链继承 : 得到方法 这才是核心!!!
function Parent(){} Parent.prototype.test = function(){}; function Child(){} Child.prototype = new Parent(); // 子类型的原型指向父类型实例 Child.prototype.constructor = Child //这两步很重要 var child = new Child(); //有test()
- 借用构造函数 : 得到属性 实际上是假继承
function Parent(xxx){this.xxx = xxx} Parent.prototype.test = function(){}; function Child(xxx,yyy){ Parent.call(this, xxx);//借用构造函数 this.Parent(xxx)错误的 因为this现在还没有Parent属性 this.yyy = yyy } var child = new Child('a', 'b'); //child.xxx为'a', 但child没有test()
- 组合
function Parent(xxx){this.xxx = xxx} Parent.prototype.test = function(){}; function Child(xxx,yyy){ Parent.call(this, xxx); this.yyy = yyy } Child.prototype = new Parent(); Child.prototype.constructor = Child //这两步很重要 var child = new Child('a', 'b'); //child.xxx为'a', 也有test()
- new一个对象背后做了些什么?
- 创建一个空对象
- 给对象设置__proto__, 值为构造函数对象的prototype属性值 this.proto = Fn.prototype
- 执行构造函数体(给对象添加属性/方法)