Javascript面向对象学习笔记--创建对象(七种模式)

Posted Leo的笔记本

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javascript面向对象学习笔记--创建对象(七种模式)相关的知识,希望对你有一定的参考价值。

一、工厂模式

   考虑到ECMAScript中无法创建类,开发人员就发明了一种函数,用函数来封装以特定接口创建对象的细节

  

function createPerson(name,age,job){
    var o=new Object();
    o.name=name;
    o.age=age;
    o.job=job;
    o.sayName=function(){
        alert(this.name);
    };
    return o;
}

var person1=createPerson("小码农",18,"码农");
var person1=createPerson("老码农",38,"码农");

  工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题,即怎么样知道一个对象的类型。(这句话怎么理解????)

 二、构造函数模式

function Person(name,age,job){
    this.name=name;
    this.age=age;
    this.job=job;
    this.sayName=function(){
        alert(this.name);
    };
}

var person1=new Person("小码农",18,"码农");
var person1=new Person("老码农",38,"码农");

与工程模式的createPerson()不同的地方:

1、没有显式地创建对象;

2、直接将属性和方法赋给了this对象;

3、没有return语句;

 

  创建的对象既是Object的实例,同时也是Person的实例

alert(person1 instanceof Object); //true
alert(person1 instanceof Person); //true
alert(person2 instanceof Object); //true
alert(person2 instanceof Person); //true

 

三、原型模式

 prototype就是调用构造函数而创建的那个对象实例的原型对象。使用原型对象的好处就是所有对象实例共享他所包含的属性和方法。

function Person(){}

Person.prototype.name="leo";
Person.prototype.age=29;
Person.prototype.job="软件工程师";
Person.prototype.sayName=function(){
     alert(this.name);
};

var person1=new Person();
person1.sayName();                   //leo

var person2=new Person();
person2.sayName();               //leo

alert(person1.sayName==person2.sayName);   //true

   与构造函数模式不同的是,新对象的这些属性和方法是由所有实例共享的。person1和person2访问的都是同一组属性和同一个sayName()方法。

  Person的每个实例-----person1和person2都包含一个内部属性,该属性仅仅指向了Person.prototype;换句话说,他们与构造函数没有直接的关系。

  可以通过isPrototypeOf()方法来确定对象之间存在这种关系。如:

alert(Person.prototype.isPrototypeOf(Person1));  //true
alert(Person.prototype.isPrototypeOf(Person2));  //true

   Object.getPrototypeOf()方法,返回[[Prototype]]的值。如:

alert(Object.getPrototypeOf(person1)==Person.prototype); //true
alert(Object.getPrototypeOf(person1).name);  //leo

   每当代码读取某个对象的某个属性时,搜索首先从兑现实例本身开始,如果找到给定名字的属性,则返回该属性的值;如果没有找到,则继续收缩指针指向的原型对象,在原型对象中查找具有给定名字的属性。有则返回该属性的值。也就是说,如果我们在调用Person.sayName()时,会先后执行两次搜索。首先,解析器会问:“实例person1有sayName属性吗? 答”没有“,然后他继续问:”person1的原型中有sayName属性么?“答:有,就读取那个保存在原型对象中的函数。

  如果我们在实例中添加了一个属性,而该属性与实例原型中的一个属性同名,那我们就在实例中创建该属性,该属性将会屏蔽原型中的那个属性。

  使用hasOwnProperty()方法可以检测一个属性是存在于实例中,还是存在于原型中。这个方法旨在给定属性存在于对象实例中时,才会返回true。

   

以上是关于Javascript面向对象学习笔记--创建对象(七种模式)的主要内容,如果未能解决你的问题,请参考以下文章

《JavaScript高级程序设计》学习笔记——面向对象编程

javascript学习笔记3——创建对象

javascript之面向对象学习笔记02

JavaScript原型学习笔记

JavaScript面向对象学习笔记

HTML 学习笔记 JavaScript(面向对象)