标签:实例 问题 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