`

对JavaScript对象原型的理解

阅读更多

文章转自:http://www.iebe.cn/blog/article.asp?id=93

 

好多学习JS的人都很难理解JavaScript的原型是个什么东东,下面就跟着我的文字,让我来带领大家解开JavaScript原型的神秘面纱。

    第一。先看如下函数

function createPerson(name,sex,birthday) {   
        //通过参数传递赋予函数对象值
        this.name = name ;
        this.sex = sex;
        this.birthday = birthday;
        this.sayHi = function(){
        alert(this.name+"is saying hello to everyone.");
        }; 
      return this;   
}    
 

 

上面函数通过定义Function类createPerson来创建一个人,并赋予人的姓名,性别,生日和说话的属性,切记,在JS中,这不同于其他的面向对象编程语言的地方,JS是没有方法这一说法。
然后,我们来创建一个人名叫Rose,定义如下

      var rose = new createPerson('Rose ','female','1985-01-01');

     这样子,我们就可以直接通过rose对象去直接访问rose具有的属性了。如rose.name,rose.sex,对于sayHi,相对特殊,因为 rose的sayHi是一个函数,所以对于sayHi的调用,就像一般的函数调用一样,rose.sayHi();

      可能你会觉得,这样子写不是好完美了吗?的确,如果在其他面向对象编程语言中,类似于这样子的写法的确是完美了,但是对于JS却有一个重要的特性,就是原 型。要理解原型,还得从分析var rose = new createPerson('Rose ','female','1985-01-01');这代码入手。这段代码执行过程大概如下,

  第一步是建立一个新对象-rose

  第二步将该对象内置的原型对象设置为构造函数prototype引用的那个原型对象,也就是因为JS每个函数,都具有原型对象如 (createPeson.prototype)。这就是说rose对象的原型对象设置为构造函数createPeson.prototype

  第三步就是将该对象作为this参数调用构造函数,完成成员设置等初始化工作。 换句话说就是   

functon createPerson(name,sex,birthday) {   

             this.name = name ;
             this.sex = sex;
            this.birthday = birthday;
            this.sayHi = function(){
         alert(this.name+"is saying hello to everyone.");
          }; 
      return this;   
}    被替换成如下的调用形式,

functon createPerson(name,sex,birthday) {   

             rose.name = name ;
             rose.sex = sex;
             rose.birthday = birthday;
             rose.sayHi = function(){
         alert(rose.name+" is saying hello to everyone.");
           }; 
      return rose;   
}  
 

  对象在通过上述三个阶段创建后,对象上的任何访问和操作都只与对象自身及其原型链上的那串对象有关,与构造函数再扯不上关系了。换句话说,构造函数只是在创建对象时起到介绍原型对象和初始化对象两个作用。

   我们再深入想想,如果我们要创建1000个rose这样子的对象,上述的三个阶段是不是要执行1000次呢?答案是。这样子就太消耗性能,那有什么方法解决呢。就是通过prototype来优化了,优化后的代码如下

------------------------------------------------------------------------

 

functon createPerson(name,sex,birthday) {   

             this.name = name ;
             this.sex = sex;
             this.birthday = birthday;
            return this;   
} 

createPerson.prototype.sayHi =  function(){
      alert(this.name+"  is saying hello to everyone.");
};
 

------------------------------------------------------------------------

     上述代码,在运行的过程中就赋予了createPerson对象具有sayHi属性,而不是在构造函数中再进行初始化设置,无疑是对性能的一个质的提升。
     然后通过

var rose = new createPerson('Rose','female','1985-01-01');
var lily = new createPerson('Lily ','female','1985-01-01');
rose.sayHi();
lily.sayHi();
//输出的结果是

Rose is saying hello to everyone.

Lily  is saying hello to everyone.

运行的结果正是我们想得到的结果。但这时可能你有疑问了,如果,函数对象和函数原型对象都同时具有sayHi方法,这时结果会怎么样子呢?还是先看如下代码

 

function createPerson(name,sex,birthday,canSay) {   
   this.name = name ;
   this.sex = sex;
   this.birthday = birthday;
   if(canSay) {
      this.sayHi = function(){
      alert(this.name+"is saying hello to everyone.");
      };   
    }
    return this;   
}   
createPerson.prototype.sayHi =  function(){
      alert(" Somebody is saying hello to everyone.");
};

var rose = new createPerson('Rose','female','1985-01-01',true);
var lily = new createPerson('哑吧','female','1985-01-01',false);
rose.sayHi();
lily.sayHi();

//运行的结果是

Rose is saying hello to everyone.

Somebody is saying hello to everyone.

怎么去理解运行结果呢?原来JS对象,在查找自身属性的时候,会先从对象的内置对象链查找是否存在该属性。因此不难理解 rose.sayHi() 的运行结果:Rose is saying hello to everyone.但是对于lily.sayHi();的运行结果又是怎么回事呢?原来JS对象先从对象的内置对象链查找是否存在该属性,查找到则返回, 如果查找不到,再去对象原型链查找,可见lily对象会从createPerson.prototype.sayHi =  function(){
      alert(" Somebody is saying hello to everyone.");
};原型链中查找返回然后再调用sayHi方法,因而得到的结果就是 Somebody is saying hello to everyone

 

 

=========================分割线==========================================

 

分享到:
评论

相关推荐

    深入理解javascript原型和闭包

    深入理解javascript原型和闭包(01)——一切都是对象 深入理解javascript原型和闭包(02)——函数和对象的关系

    第15章 javascript面向对象与原型

    在深入讲解JavaScript面向对象与原型的知识点之前,首先需要了解JavaScript的基础知识。在JavaScript中,面向对象编程(OOP)的...正确理解并运用这些概念,可以让开发者更有效地利用JavaScript进行面向对象的编程。

    深入理解javascript原型和闭包.pdf

    JavaScript原型和闭包是这门语言中两个比较难以理解且与其他面向对象语言区别较大的概念。理解这两个概念,不仅能让我们更深层次地理解JavaScript,而且有助于我们了解编程语言的设计思路,拓宽我们的视野。 首先,...

    JavaScript 面向对象与原型

    以下是对JavaScript面向对象和原型机制的详细解释: 1. 面向对象的基本概念: - 类:在许多面向对象语言中,类是创建对象的模板,但在JavaScript中没有类的概念。 - 对象:JavaScript中的对象是一组键值对,可以...

    浅析JavaScript实现基于原型对象的“继承”.pdf

    通过对JavaScript的原型继承机制的介绍和实例分析,提出一个改进的“寄生组合模式”,使读者能够更好地理解和应用JavaScript的原型继承。 概述 JavaScript是一门面向Web的编程语言,具有高端、动态以及面向对象的...

    JavaScript原型链

    首先,每个JavaScript对象都有一个内部属性`[[Prototype]]`,通常我们通过`__proto__`或`Object.getPrototypeOf`来访问。这个属性引用了创建当前对象的构造函数的原型对象。原型对象本身也是一个对象,因此它也有...

    理解Javascript原型继承原理

    - 每个JavaScript对象都有一个内部的`[[Prototype]]`属性,该属性链接到当前对象的原型对象。 - 当尝试访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,则会沿着`[[Prototype]]`链向上查找,直到...

    js 原型对象和原型链理解

    最近正在读《Javascript高级程序设计》,书中对原型对象和原型链的描述让我受益匪浅,下面仅用一个对比性的例子来说明。 我们经常会这么写 function Person () { this.name = 'John'; } var person = new ...

    Javascript面向对象编程.

    JavaScript是一种广泛应用于Web开发的脚本语言,尤其在前端领域占据着核心地位。面向对象编程(Object-Oriented Programming,OOP)是...学习这些材料将有助于深入理解JavaScript的面向对象编程,提升你的编程技能。

    javascript对象参考手册

    "JavaScript对象参考手册"涵盖了这一主题的广泛内容,旨在为开发者提供全面、深入的理解和实用指南。手册分为20个章节,不仅涉及基础概念,还深入探讨了如ActiveX技术这样的高级特性以及数据库访问等复杂话题。 ...

    图文详解JavaScript的原型对象及原型链

    JavaScript的原型对象和原型链是理解JavaScript继承机制的关键概念。首先,我们来区分两个关键的属性:`prototype`和`__proto__`。 1. `prototype`:主要用于构造函数,它是构造函数的一个属性,用于定义实例对象将...

    深入探索JavaScript的原型继承:机制、实现与最佳实践

    在JavaScript的世界里,原型继承不仅是实现对象功能共享的核心机制,也是其面向对象编程风格的基础。本文将深入探讨JavaScript原型继承的工作原理、实现方式以及在现代Web开发中的应用。 JavaScript的原型继承是一种...

    深入浅出JavaScript对象模型

    简而言之,可以将JavaScript对象视为一个包含键值对的容器,这些键通常代表属性名称,而对应的值则可以是任何类型的数据。 #### 对象与属性的动态特性 JavaScript是一种解释型脚本语言,这使得它可以在运行时动态...

    深入理解JavaScript系列

    深入理解JavaScript系列(5):强大的原型和原型链 深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP 深入理解JavaScript系列(7):S.O.L.I.D五大原则之开闭原则OCP 深入理解JavaScript系列(8):...

    学习javascript面向对象 理解javascript原型和原型链

    在深入理解JavaScript面向对象编程时,了解其原型和原型链的概念至关重要。本文将详细解释这些概念以及它们如何工作,帮助初学者构建扎实的基础。 首先,原型链是JavaScript中实现继承的一种机制。在JavaScript中,...

    面向对象JavaScript精要(英文原版pdf)

    类本质上是对构造函数和原型模式的一种语法糖,提供了更简洁的方式来定义类和子类。 #### 四、本书主要内容概述 本书全面覆盖了面向对象编程的基础理论,并结合JavaScript的具体实现进行讲解。 - **第一章:...

    深度探讨javascript函数的原型链和闭包

    理解函数的原型链和闭包对于深入掌握JavaScript至关重要。 首先,让我们看看函数的定义方式。在JavaScript中,我们可以使用`function`关键字直接定义函数,如`function fn(a, b) {}`。此外,函数也可以通过赋值语句...

Global site tag (gtag.js) - Google Analytics