1.最简单的方式 创建Object实例 再添加属性和方法
var person = new Object();
person.age = 20;
person.name = "cxk"
person.sayName = function(){
alert("i can sing dance rap")
}
2.对象自变量
var person = {
name: "张三"
age: "28"
sayName: function(){
}
};
前两个创建单个对象用起来比较方便 但
是同一个接口创建很多对象 会产生大量重复代码
3.工厂模式
function createPerson (name,age,job) {
var o = new Object();
o.name=name;
0.age=age;
o.job=job;
o.sayName = function(){
alert(this.name)
}
}
var person1=createPerson("zhangsan",29,"dancer")
var person2=createPerson("lisin",29,"singer")
...
工厂可以大量生产了 但问题是 无法知道类型 怎样知道呢(创建对象的类型)
4.构造函数
function Person(name,age,job) {
this.name=name;
this.age=age;
this.job=job;
this.sayName = function(){
alert(this.name)
};
}
通过这样创造的所有对象 既是Object的实例 又是Person的实例
可以用instanceof验证
构造函数比工厂好的地方就在于 将来可以将它的实例标识为一种特定的类型
但构造函数也是有缺点的
以构造函数创造的每一个实例中,都会包含一个不同的Function实例
这样就很没必要 解决方法是把构造函数里的fanction提到全局
但问题是如果方法很多,那么全局变量过多 这引用函数还有什么封装性可言?
- 原型模式
我们创建的每个函数 都有一个prototype属性 这个属性是一个指针, 这个指针指向一个对象
这个对象其实就是它的原型对象
好处是可以让所有实例对象共享它的属性和方法
function Person () {}
Person.prototype.name = "zhangsan"
Person.prototype.age = 28
Person.prototype.sayName = function(){
alert()
}
var person1 = new Person();
person1.sayName();
但他的问题也在于共享 ,尤其是包含引用类型的属性
比如修改person1引用的数组
但这个数组是存在于原型中
这明显是不符合期望的 所以很少单独用原型模式
6.组合使用原型和构造函数
创建自定义类型最常见的方式
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.friends = ['a','b']
}
Person.prptotype = {
constructor: Person,
sauName :function() {
}
}
var person1 = new Person("aaa",29,"singer");
-
动态原型方式
function Person(name,age,job){ this.name=name; this.age=age; this.job=job; if(typeof this.sayName !="function"){ Person.prototype.sayName = function(){ alert("") }; } }
8.寄生构造函数模式
在前面都不适用的情况下 可以使用这个
function Person (name,age,job) { var o = new Object(); o.name=name; 0.age=age; o.job=job; o.sayName = function(){ alert(this.name) } return o; } var friend = new Person("",29,"singer")
要说明的是这样返回的对象与构造函数或原型属性没有关系 所以不要轻易用
9. 稳妥构造函数模式
function Person (name,age,job) {
var o = new Object();
o.name=name;
0.age=age;
o.job=job;
o.sayName = function()
{
alert(name)
}
return o;
}
可以提供安全性