JS创建对象

[对象] [构造函数] [prototype]

####创建对象 1.简单创建

var person = new object();
person.name="aaa";
person.get = function(){
return this.name
}

问题:代码重复,创建一个对象,相应要写.name,.get的代码,为了节省代码,出现了下面这种

2.工厂模式

var createPerson= function(name){
 var obj = new Object();
 obj.name = name;
 obj.get = function(){
 return this.name;
 }
 return obj;
}

问题:没法解决对象识别问题(没办法知道对象类型)

3.构造函数模式

var Person = function(name){
	this.name = name;
	this.get = function(){
		return this.name;
	}
}

要创建Person实例,要使用new操作符,以这种方式构造会经历以下4个过程:

var p = new Person();

var obj = {}
obj.proto = Person.prototype

Person.call(obj)//构造obj,也可以称之为初始化obj
return obj

任何函数只要通过new调用就变成了构造函数

构造函数的三种用法: 1.构造函数使用 2.普通函数使用

var p = Person("haha");//this指向windows

3.在另一个对象作用域里调用

var o =new object();

Person.call(o,"haha");

o.get();

问题:每个方法都要在实例上创建一遍,一些共有的方法不想重复创建

4.原型模式

function Person(){}

Person.prototype.name=1;
Person.prototype.get = function(){
return this.name;
}

var p = new Person();
p.name//1

注:当我修改实例中的基本类型时,不会影响原型,而修改引用类型的,会影响原型,这也是原型模式最大的问题

函数中有个属性(prototype)指向她的原型对象,其原型对象有个属性constructor,指向该函数 当创建实例后,该实例有个属性(proto),指向构造函数的原型对象

5.构造函数+原型混合模式

为了解决原型问题

function Person(name){
this.name= name;
this.friends= ["haha","m"];
}

Person.prototype = {
	constructor:Person,
	sayName: function(){
	return this.name
	}
}

继承 1.原型链继承 2.借用构造函数(call,apply)

子类构造函数中调超类构造函数

function A(){
this.color = ["1","2"];
}

function a(){
A.call(this);
}

3.组合继承

属性由call,apply继承 共有方法由原型链继承