总结创建对象的集中方式以及优缺点分析
最近由于需要面试,自己开始整理JS知识。从最重要的创建对象开始吧。以下是自己的整理内容,在整理的过程中,自己也参考了其他大神的博客。
1.字面变量创建对象
1)var obj = {name: 'yh'}
优点:简单明了,适合创建当个对象
缺点:复用性差,只适合单次或者简单使用。
2)var obj = new Object();
obj.name = 'yh';
优点:简单明了,适合创建当个对象
缺点:复用性差,只适合单次或者简单使用。
3.工厂模式创建对象
function person(name) {
var obj = new Object();
o.name=name;
return o;
}
var per = person('yh');
优点:可以复用代码
缺点:不能确定返回对象的类型(因为它返回的对象的原型都指向Object)
利用(per instanceOf person)输出的false可以看到
per instanceOf Object //true
4.构造函数模式创建对象
function Person(name) {
this.name=name;
this.sayName = function () {
console.log(this.name)
}
}
var person = new Person('yh');
优点:可以传参数,可以识别对象类型
缺点:在多次实例化调用方法,每个方法都要被创建一次
优化:
function Person(name) {
this.name = name;
this.sayName=sayName;
}
function sayName() {
console.log("nihao");
}
优点:不需要每次实例化去重新创建方法了
缺点:如果有很多方法能?得创建多少个全局变量的函数
5.原型模式创建对象
function person() {}
person.prototype.name='yh';
person.prototype.sayName=function() {
console.log('111');
}
var person1 =new person();
优点:所有的实例都继承了原型的方法和属性
缺点:数据共享,导致原型上的应用类型数据会受到实例的干扰。
6.原型和构造的混合模式
function Person(name.age){
this.name=name
}
Person.prototype={
constructor:Person,
sayName:function(){
console.log('nihao');
}
}
优点:公有属性和方法都可以通过原型继承,私有的并不互相影响。
7.寄生模式。
只是在实例化的时候添加通过new,其他的都和工厂模式一样
8.动态原型模式
function Person(name){
this.name=name;
if(typeof this.sayName!='function'){
Person.prototype.sayName = function(){
console.log('11');
}}
}
继承的编写集中方式: