标签:实例 问题 type属性 缺点 script 重复 引用类型 工厂模式 back
创建对象的方式:
1、使用原生引用类型Object()
//使用引用Object创建 new Object() var obj1=new Object(); obj1.name="obj1"; obj1.num=1;
2、对象字面量创建
var obj2={
name:"obj2",
num:2
};
这两种方式的缺点: 当需要创建很多对象的时候,会产生大量的重复代码
3、工厂模式 用函数来封装以特定接口创建对象
function obj3(name,num){
var b=new Object(); //显示的引用Object创建对象
b.name=name;
b.num=num;
b.sayName=function(){
alert(this.name);
};
return b; //return 回一个对象
}
var people=obj3("obj3",3); //并未使用new 而是直接调用函数,返回一个对象
可以无数次的调用obj3函数,每次都return 一个包含两个属性和一个方法的对象;
缺点:无法解决对象识别问题;
4、构造函数模式(创建自定义构造函数)
//构造函数模式
function Person(name,num){
this.name=name;
this.num=num;
this.sayname=function(){
alert(this.name);
}
}
var person1=new Person("obj4",4);
与工厂模式的不同:1、没有显示的创建对象;
2、直接将属性和方法赋值给this;
3、没有return 语句;
实例person1保存着一个属性constructor==Person(等于构造函数),对象的constructor属性最初就是用来标识对象的;这正是构造函数模式胜过工厂模式的地方;
缺点:每个方法都要在每个实例对象上重新创建一遍;
5、原型模式:构造函数有一个prototype属性,指向原型对象,而这个原型对象包含由构造函数创建的实例共享的所有属性和方法;
所有原型对象都有一个constructor属性,指向构造函数
//原型模式
function Person5(){}; //自定义构造函数 为空
Person5.prototype={
constructor:Person,
name:"china",
num:5,
sayname:function(){
alert(this.name);
}
};
var obj5=new Person5();
缺点:省略了为构造函数传参,结果所有实例在默认情况下都将获得相同的属性值,对于引用类型值得属性,只要有一个实例push到一个数组中值,那么其他实例也会获得这个新值,这就是为什么不单独使用原型模式的原因;
6、构造函数和原型模式组合使用 构造函数模式用于定义实例属性;原型模式用于定义方法和共享属性;
//构造函数和原型模式组合使用
function Person6(name,num){
// prototype:Person.prototype;
this.name=name;
this.num=num;
}
Person6.prototype={
constructor:Person6,
sayname:function(){
alert(this.name);
}
}
var obj6=new Person6("obj6",6);
补充:
1、检测对象类型:instanceof
实例 instancsof 构造函数 //true
2、检测实例的原型是否有某一对象
只有实例的prototype属性指向的对象才返回true; 原型.isPrototypeOf(实例)
Person6.prototype.isPrototypeOf(obj6) //true
Object.isPrototypeOf(obj6) //false
3、Object.getPrototypeOf() 识别原型
alert(Object.getPrototypeOf(obj6)==Person6.prototype); //true alert(Object.getPrototypeOf(obj6)==Object); //false
4、hasOwnProperty() 检测一个属性是否存在于实例中还是原型中 只有存在于对象实例才会返回true
name必须用引号包起来,,否则为false;
obj6.name=7;
console.log(obj6.hasOwnProperty("name")); //true
5、得到所有属性无论它是否 Object.getOwnPropertyNames()
console.log(Object.getOwnPropertyNames(obj6));
console.log(Object.getOwnPropertyNames(Person6.prototype));
标签:实例 问题 type属性 缺点 script 重复 引用类型 工厂模式 back
原文地址:https://www.cnblogs.com/yongyang/p/8909012.html