前端面试——创建对象的方法、实例属性和原型属性

1.创建对象的方法有几种?分别是什么?

https://blog.csdn.net/a569171010/article/details/7467514

       小结:JS创建对象主要有4种方法:工厂模式、构造函数模式、原型模式、组合方法

  • 工厂模式不能解决对象识别的问题。
  • 构造函数模式无需创建私有的对象,而是将属性和方法挂载到this上,并且无返回值,更加贴近面向对象的特点,使用时利用new关键字(创建一个对象;构造函数的作用域指向该对象,即this指向了该对象;执行构造函数代码;返回该对象)。总体而言,构造函数模式生成的多个实例,其属性和方法都是私有的,即,实现了属性的私有,但是没有实现方法的共享
  • 原型模式将属性和方法放在函数的原型上,通过这个函数创建的所有的实例都会共享原型上的属性和方法,也就是说,原型模式中的属性和方法都实现了共享,即,实现了方法的共享,但是没有实现属性的私有
  • 组合方法是将构造函数模式和原型模式进行组合的一种方法。将所有的属性挂载到构造函数的this上,将所有的方法挂载到函数的原型上,这是因为一般而言方法需要共享和复用,而对于不同的实例其属性一般都是不同的。总而言之,组合方法既实现了方法的共享,又实现了属性的私有

------------------------------------------------------细节-------------------------------------------------------

      最基础的方法是先用new Object()创建对象,再给对象添加属性,缺点很明显,每个实例都要创建一个新的对象,代码量大,且这些实例之间无法表明他们的关系,即他们都有着相同的属性和方法,只是对应的值不同。

    var people1 = new Object();//只有对象上才能添加属性
    people1.name = 'fanlizhi';
    people1.sayName = function(){alert(people1.name);}
    var people2 = new Object();
    people2.name = '小明';
    people2.sayName = function(){alert(people2.name);}
                                                                                                          
    people1.sayName();//fanlizhi
    people2.sayName();//小明

     典型的方法:  工厂模式、构造函数模式、原型模式、组合方法(最经典)

(1)工厂模式

    进步:较上面相比,有统一的入口方法createPerson,并且n个实例代码量明显减少。

    缺点:不能解决对象识别的问题,我不知道people1和people2都是属于什么对象的。

(2)构造函数模式

     进步:更加靠近面向对象语言形式了, 用到new关键字和“类名”(方法名Person)开头大写。直接将this指向Person而且不需要return对象。

     缺点:因为每次实例化的时候都会执行Person方法,所以每个实例不仅有自己独有的name同时,也将有自己独有的sayName方法(不是同一个方法的引用),因此浪费了资源,我们只需要调用同一个方法就行了而不像现在调用的是两个sayName方法。

       在上面的例子中,对象person1和person2是构造函数Person创建的实例。所谓的构造函数也只不过是普通的函数通过操作符new来调用。在使用new操作符调用函数时主要执行以下几个步骤:

  • 创建新的对象,并将函数的this指向新创建的对象
  • 执行函数
  • 返回新创建的对象

      坑:通过这种方法还存在一个问题,若原始函数返回一个引用类型,那么其函数实例的类型是一个普通的对象,而不是该函数的实例。

(3)原型模式

     缺点:共享带来不同实例无法独立。

     重点:通过这个函数创建的所有实例都会共享原型上的属性和方法。

对应的原型链的图:

(4)组合方法

        属性都放在构造函数中,方法都放在原型上,既解决了构造函数模式使得所有实例的方法都独立带来的开销大的问题,,又解决了原型模式使得所有实例的属性都共享所带来的耦合问题。

2.实例属性和原型属性

概念:

  • 实例属性:对象自身独有的属性和方法
  • 原型属性:位于其原型链上的属性和方法

相关的API:

  • in : 判断属性和方法判断属性和方法是否在该对象上(实例属性和原型属性都算,是一个粗粒度的判断)
  • hasOwnProperty()用来判断对象上的属性是否是其自身独有的,是则返回true,否则返回false,相比于in,hasOwnProperty()是细粒度的判断。
  • delete 删除对象上的实例属性
  • for in迭代遍历属性,无论是实例属性和原型属性都算,只要是可迭代的。

例子和图:

 

没有更多推荐了,返回首页