Javascript 原型和继承(Prototypes and Inheritance) 收藏
 前面我们看到了如何使用 constructor 来初始化对象。如果这样做,那么每一个创建的新对象都会对那些相同的属性,方法建立一个独立的副本。而实际上有更加有效的方法来指定方法,常量,以及其他一些可被所有该类的对象共享的属性。

JavaScript 对象从一个原形对象(prototype object) 继承属性。所有对象都有原型;原型的所有属性看上去就像使用它作为原型的那些对象的属性一样。简单的说就是:所有对象都从他的原型继承属性。
(each object inherits properties from its prototype).

对象的 prototype 通过它的 constructor function 来定义。JavaScript 里所有的 function 都有一个 prototype 属性。这个属性开始是空的,接下来你给他添加的任何属性都会被 constructor 创建的对象所拥有。

prototype 对象和 constructor 相关联。这意味着 prototype 可以作为放置方法以及其他常量的理想场所。原型中的属性不会被复制到新创建的对象中去,他们的属性看上去就像对象的属性一样。这意味着,使用原型能够大幅度的减少多个同类对象占用的内存。

每一个 class 都只有一个 prototype object, 附带一套属性。但我们在运行时可能会创建多个类的实例。那么如果发生对原型的属性的读写会发生什么情况?
当你读一个属性的时候,JavaScript 首先尝试去查找对象本身是否有这个属性,如果没有,接着去查找原型里面是否有。有的话就返回结果。
而当你写原型的属性的时候,因为多个对象共享原型,显然是不能直接在原型上进行写操作的。这个时候实际上 JavaScript 会在对象上创建一个同名的属性,然后把值写到里面。当你下次读这个属性的时候,JavaScript 一下子就在对象的属性里查找到了,那么就不需要去原型里查找了。这个时候,我们说“对象的属性掩盖或隐藏了原型的属性”。(shadows or hides) 。

从上面讨论看出,其实我们在设计类的时候,只要掌握一个原则:在原型里仅定义一些方法(方法一般是不会变的),常数,常量等。做到这一点就不容易混淆了。
例子:

// Define a constructor method for our class.
// Use it to initialize properties that will be different for
// each individual Circle object.
functionCircle(x, y, r)
{
    this.x = x;  // The X-coordinate of the center of the circle
 
this.y = y;  // The Y-coordinate of the center of the circle
 
this.r = r;  // The radius of the circle
}
 
 
// Create and discard an initial Circle object.
// This forces the prototype object to be created in JavaScript 1.1.
new Circle(0,0,0);
 
 
// Define a constant: a property that will be shared by
// all circle objects. Actually, we could just use Math.PI,
// but we do it this way for the sake of instruction.
Circle.prototype.pi =
3.14159;
 
 
// Define a method to compute the circumference of the circle.
// First declare a function, then assign it to a prototype property.
// Note the use of the constant defined above.
function Circle_circumference(  ) { return
2
*
this.pi *
this.r; }
Circle.prototype.circumference =Circle_circumference;
 
 
// Define another method. This time we use a function literal to define
// the function and assign it to a prototype property all in one step.
Circle.prototype.area =
function(  ) { return
this.pi *
this.r *
this.r; }
 
 
// The Circle class is defined.
// Now we can create an instance and invoke its methods.
var c =
new Circle(0.0, 0.0, 1.0);
var a =c.area(  );
var p = c.circumference(  );

内置的类的 prototype.

不光是用户自定义的类可以有 prototype. 系统内置的类比如 String, Date 也都有的。而且你可以向他们添加新的方法,属性等。
下面这段代码就对所有的 String 对象添加了一个有用的函数:

// Returns true if the last character is c
String.prototype.endsWith =
function(c) {
    return (c ==
this.charAt(this.length-1))
}

然后我们就可以类似这样的来调用了:

var message =
"hello world";
message.endsWith('h')  // Returns false
message.endsWith('d')  // Returns true

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/raymondhuang/archive/2009/04/01/4041805.aspx

Javascript 原型和继承(Prototypes and Inheritance)相关推荐

  1. JavaScript原型与继承的秘密

    原文发布在dreamapplehappy/blog,本文如若有更新,都会在我的博客进行更新. 我们最想夸耀的事物,就是我们所未拥有的事物 <罗生门>- 芥川龙之介 JavaScript的原 ...

  2. javascript 原型链继承

    JavaScript中没有类的概念,只有一个构造函数来创建对象. 但是JavaScript也可以实现继承. 首先要说的是,JavaScript中的对象分为函数对象和普通对象. 何为函数对象?? 就是 ...

  3. javaScript原型及继承

    一.浅谈原型 首先我们要知道创建对象的方法有两种: 1.通过字面量的方式直接创建 1 var obj = { 2 name:'baimao', 3 age:21 4 } 2.通过构造函数创建对象 1 ...

  4. JavaScript: 原型链继承(原理解析 + 代码实现 + 结构图解)

    文章目录 一 原型搜索机制 1.1 代码实现 1.2 结构图解 1.3 搜索机制 二 原型链代码实现 2.1 代码实现 2.2 结构图解 2.3 链条拓展 三 原型链的缺点 原型链是实现继承的一种方式 ...

  5. 图解JavaScript原型链继承

    JavaScript是基于原型链的继承的,忘掉类的继承,从原型链入手. 普通对象 函数对象 JavaScrip只有一种结构:对象 通过new Function()创建的对象都是函数对象,其他都是普通对 ...

  6. ES6 继承(复习原型链继承)

    2019独角兽企业重金招聘Python工程师标准>>> 原型链继承 <script type="text/javascript">/* 原型链 继承 ...

  7. Javascript的对象继承方法

    许多OO 语言都支持两种继承方式: 接口继承:只继承方法签名 实现继承:继承实际的方法. 由于函数没有签名,在ECMAScript 中无法实现接口继承.ECMAScript 只支持实现继承 原型链继承 ...

  8. JavaScript原型链污染攻击

    前言 最近在看js的时候看到p神的一篇关于js原型链污染的文章,学习一下. 下面转自p神:深入理解 JavaScript Prototype 污染攻击 还有一篇案例关于js原型链污染的ctf题:从一道 ...

  9. 白话解释 Javascript 原型继承(prototype inheritance)

    来源: 个人博客 白话解释 Javascript 原型继承(prototype inheritance) 什么是继承? 学过"面向对象"的同学们是否还记得,老师整天挂在嘴边的面向对 ...

最新文章

  1. python3安装常见问题_Python3下安装spyder及常见问题解决
  2. Linux系统压缩及解压缩
  3. Java 8 Friday Goodies:Lambda和XML
  4. unity2018关联不到vs_现实VS真爱:远嫁的幸福和悲哀
  5. 荣耀开年第一机!荣耀60 SE今日官宣:搭载天玑900处理器
  6. 如何在Exchange 2013中禁用对ECP的外部访问
  7. 在MAC OS X下安装usb转串口驱动(PL2303主控芯片)
  8. 课程设计-基于SSM实现个人健康管理系统
  9. java存档_Java实现简单棋盘存档和读取功能
  10. linux系统编程实训总结,linux实训总结与体会
  11. qt清空qtablew_qt项目:员工信息管理系统
  12. Zabbix学习笔记(七)---网络波动监控
  13. php sapi全拼,php sapi
  14. 南京审计大学计算机考研专业课答案
  15. 计算机专业的在职研究生,计算机在职研究生考什么
  16. 穿越鸿蒙电视剧,2020“必追”的5部穿越剧,每一部都有高颜值,剧荒的别错过!...
  17. Java入门学习(九)
  18. Nginx 之父已被释放!
  19. c/c++ 编程软件(IDE)推荐
  20. 打开i信服务器正在运行中,【网络异常,0/12157 Unknown】i信登录时出现

热门文章

  1. android 一些常用的功能方法代码块
  2. 如何解决访问Windows Update网站时收到0X8024001D错误信息
  3. Java线程中的资源共享问题
  4. hdu 4362(单调队列优化dp)
  5. anyproxy学习4-Linux(Centos)搭建anyproxy环境
  6. 关于springmvc下服务器文件打包成zip格式下载功能
  7. .net 调用java service 代理类方法
  8. iOS WebView的用法
  9. ⑧javaWeb之在例子中学习(过滤器Filter)
  10. 图书《图像并行处理技术》简介