JavaScript基础概念之----面向对象----创建对象(深入原型及原型链)

一、使用Object构造函数或对象字面量创建对象

var person = new Object()
person.name = 'adhehe';
person.age = 23;
//...
// 
var person = {
  name:'adhehe',
  age:23,
  //...

}

缺点:使用同一个接口创建很多的对象,会产生大量的重复代码。

二、工厂模式

这种模式抽象了创建具体对象的过程。用函数来封装以特定接口创建对象的细节。

function createPerson(name,age){
  //将创建的具体细节封装起来,最后返回一个对象
var o = new Object(); o.name = name; o.age = age; o.getName = function(){ return this.name; } return o; } var person1 = createPerson('adhehe',23); var person2 = createPerson('Jhone',45);

缺点:虽然解决了创建多个相似对象的问题,但没有解决 对象识别的问题,即怎么知道一个对象的类型

三、构造函数模式

构造函数可以用来创建特定类型的对象。如Object、Array等。也可以创建自定义构造函数。

function Person(name,age){
    this.name = name;
    this.age = age;
    this.getName = function(){
        return this.name;
    }
}    

var person1 = new Person('adhehe',23);
var person2 = new Person('Jhone',45);

以new关键字创建Person的实例,经历以下4个步骤:

  • 创建一个新对象
  • 将构造函数的作用域赋给了新对象(即this指向了这个新对象)
  • 执行 构造函数中的代码(即为新对象添加属性)
  • 返回新对象

instanceof 操作符 可以检测对象的类型

//以person为例

console.log(person1 instanceof Person)
console.log(person2 instanceof Person)
console.log(person1 instanceof Object)
console.log(person2 instanceof Object)
//都输出 true

构造函数与普通函数的唯一区别是:调用的方式不同。只要通过new操作符调用,它就是构造函数。

缺点:每个方法都要在每个实例上重新创建一遍。

//以上面 person为例

person1.getName == preson2.getName
//false

四、原型模式

创建的每个函数都有一个prototype(原型)属性,它是一个指针,批向一个对象,而这个对象的用途就是:包含可以共享的属性和方法,给那些特定类型的所有实例。

function Person(){}

Person.prototype.name = 'adhehe'
Person.prototype.age = 23
Person.prototype.getName = function(){
  return this.name;
}

var preson1 = new Person()
var preson2 = new Person()

console.log(person1.getName())
console.log(person2.getName())
//都返回 adhehe

person1.getName == person2.getName
//true

猜你喜欢

转载自www.cnblogs.com/adhehe/p/9787725.html