JS原型对象通俗"唱法"

书上对于原型对象的说法给我整的眼花缭乱,完全不知道它在说什么,查了好多资料,终于有了些理解,下面我以通俗的大白话说说我对原型对象的理解.

1.关于原型对象的重要知识点

首先要知道一个很重要的知识点,一句话:所有对象都有原型对象.

2. 对比其他语言的理解

原型对象,就是其它语言中的类中的静态属性和静态方法,总是是静态-static就对了.原理是: 内存中只有一份.

3. 在内存中的形象图:

首先,在产生js对象之前,我们需要创造一个构造函数(这都不知道,那就不要往下看了),如下:

function Person(name_, age_) {
         this.name = name_;
         this.age = age_;
}

下面,我们就要new 对象了,这里,我们new三个(Person)对象,"张三" "李雷" "韩梅梅",他们来自同一个构造函数Person:

内存中就这样了,每个对象,都有自己的 name, age 内存.这里new了多少个对象,就要开辟多少块name, age内存.

看到这,应该还是比较好理解的. 下面我们添加一条属性.location属性,如下:

function Person(name_, age_) {

this.name = name_;

this.age = age_;

this.location = "地球";

}

这时候 我们在new这三个人. 内存情况如下:

这里我们看,三个对象都有一个"地球"的内存空间.  这里你要动动大脑了, 三个人都有地球的内存,我们是不是可以这样呢?

你看这样好不好呢?  这样只需要一个地球,大家都可以用了.   看到这,好吧,公用的那个空间如果是个对象的话,就是所谓的原型对象了.饿?就这样?

是的,就这样.

原型对象,最重要的作用就是把常量和方法独立到自身里.   供给其它 "自己的对象" 使用. 最后如图:

4. 从代码的层次上介绍原型对象.

上图是内存中的对象,我们现在从代码的从面操作.

function Person(name_, age_) {

this.name = name_;

this.age = age_;

this.location = "地球";

}

//  三个具体的对象

var zhangsan = new Person("zhangsan", 21);

var lilei = new Person("lilei", 21);

var hanmeimei = new Person("hanmeimei", 21);

// 他们的原型对象是

Person.prototype.location = "地球";

Person.prototype.killPerson = function() {

return "杀人";

};

这里有一个问题,我们知道原型对象,可是我们怎么访问到原型对象里的属性呢.  就是我们如何获取到location ,和用 killPerson方法呢?

请看:

alert(zhangsan.location);

alert(zhangsan.killPerson());

这样就可以访问到了,不过前提是,你的对象属性里面,没有定义location和killPerson.不然会把原对象的覆盖掉.   这里面涉及到原型问题即,

在zhangsan.location的时候,首先,我们检查zhangsan对象本身,从图中我们知道,张三有 name, age
和prototype指针属性. 
并没有location,找不到以后,它会继续搜索原对象里面,看能否找到location属性,如果有,就会调用原对象的属性.

所以alert(zhangsan.location) 会输出   "地球"

alert(zhangsan.killPerson() ) 会输出   "杀人"

时间: 2024-08-26 19:41:08

JS原型对象通俗"唱法"的相关文章

浅析JS原型对象&实例对象&构造函数(转)

浅析原型对象,实例对象,构造函数的关系 原文地址:JS面向对象-原型对象,实例对象,构造函数的关系(http://blog.csdn.net/u014205965/article/details/45798861) 因为最根上的object拥有一个prototype属性,而js中所有的对象又都继承自object,所以js中所有的对象都拥有一个prototype属性,而在js中函数也是对象,所以js中每个函数也都有一个prototype属性. 例如:function Person(){...} 和

js原型对象与Java类的区别

在我学习Javascript的原型对象时,我总是不自觉地拿Java的类思想来做比较,时间久了,我渐渐认识到二者有巨大的不同. 首先,类是不能直接当方法来运行,它最简便的方式是调用其静态方法:而原型对象本身就是一个方法体,它可以直接运行.二者在构造对象的过程中,js可以扮演两种角色,一个可以将原型对象当方法来使用,才接触js时,都是以这种形式来使用,即万物皆方法体,像c;另一个是模仿面向对象的特性,为原型对象定义属性,运用构造器时,将构造器构造的对象的指针指通过原型链指向原型对象的属性,从而实现面

js原型对象

原型对象是什么? 在js中,每一个创建的的函数都会有一个prototype属性,这个属性指向一个对象,这个对象就是原型对象 function lla(){} console.log(lla.prototype); chrome浏览器下的结果: 原型对象能干啥? 首先,当你用new 调用了一个函数,就会创建一个对象实例然后返回这个对象 可以看到a是一个名叫lla的对象,有一个__prototype__的属性(后面介绍),这里可以认为这个对象是空的:为什么是空的呢?因为构造函数里面是空的: 如何才能

js原型对象中属性被覆盖(1)

/**   *@author 程无衣   *@description 关于在原型对象中属性被覆盖   */       function Person(){}       Person.prototype={   constructor:Person,   age:24   }       var person1= new Person();   person1.age=20;   console.log(person1.age);//20   /*输出的是实例的age属性   说明Person

Js 原型对象与原型链

原型对象 每个javascript对象都有一个原型对象,这个对象在不同的解释器下的实现不同.比如在firefox下, 每个对象都有一个隐藏的__proto__属性,这个属性就是"原型对象"的引用. 原型链 由于原型对象本身也是对象,根据上边的定义,它也有自己的原型,而它自己的原型对象又可以有自 己的原型,这样就组成了一条链,这个就是原型链,JavaScritp引擎在访问对象的属性时,如果在对象本 身中没有找到,则会去原型链中查找,如果找到,直接返回值,如果整个链都遍历且没有找到属性,则

js原型对象,每个new出来的新对象都有独立的原型对象__proto__

刚才看一篇博文的时候, 动手测试了一下 JavaScript的原型链, 原型对象,发现每个构造器(赋给了某个 prototype ) new 出来的对象都有各自独立的原型对象 __proto__. prototype 与 __proto__指向的都是同一个对象,一个是"类"上面的,一个是"对像"上面的. prototype 从字面上"type"就说明了,这个代表一个"类", 是一个类别.集合,而不是具体的. 类似于 C++语言

JS原型对象的问题

原型模式最大的问题是由其共享的本性所导致的.我们知道,原型中所有的成员是被很多实例共享的,这种共享对于函数非常合适.对于那些包含基本值的属性倒也说得过去,毕竟可以通过在实例上添加一个同名的属性来隐藏原型中对应的属性:然而,对于包含引用类型值的属性来说,问题就比较突出了.来看下面的代码: function Wede(){}//重写构造函数的原型对象,其中定义了一个基本类型和一个引用类型:Wede.prototype={name:"wede.zhao",friends:["jam

js 原型 对象篇

一切皆对象 js中  值类型就不是对象  剩下的都是对象(也就是引用类型) typeof()运算符 判断四种值类型 typeof 10; --> Number  ||   typeof "10" -->String  || typeof true --> Boolean  || typeof x --> undefined typeof(funciton(){}) --> function typeof([1,2,3]) --> Object typ

[js高手之路]原型对象(prototype)与原型链相关属性与方法详解

一,instanceof: instanceof检测左侧的__proto__原型链上,是否存在右侧的prototype原型. 我在之前的两篇文章 [js高手之路]构造函数的基本特性与优缺点 [js高手之路]一步步图解javascript的原型(prototype)对象,原型链 已经分享过了. function CreateObj(uName) {             this.userName = uName;             this.showUserName = function