[翻译]JavaScript中对象的层次与继承(7)
作者:chenzhe 来源:chenzhe 发布时间:2008-12-31 13:36:00
标签:类,对象,继承,javascript,编程
又见属性继承
上一部分描述了在JavaScript中,构造器和原型是如何提供层次和继承的。就像在所有的语言中一样,在之前的讨论中有一些细微之处还没有能够充分地暴露(not necessarily apparent)。而这一部分就来讨论这些细微之处中的几个。
本地值和继承的值
我们再来概括地看看属性的继承。正如在之前讨论的,当你访问一个对象的属性,JavaScript进行如下几步:
* 查看是否存在本地值。如果存在,返回那个值。
* 如果不存在本地值,检查原型链(使用__proto__属性)。
* 如果在原型链中的某一个对象有该属性值,则返回那个值。
* 如果没有找到这个属性,说明这个对象没有这个属性值。
这一些列简单步骤的结果取决与你是如何在原型链上(along the way)定义对象的。在我们原来的例子中,我们有如下定义:
程序代码
function Employee () {
this.name = "";
this.dept = "general";
}
function WorkerBee () {
this.projects = [];
}
WorkerBee.prototype = new Employee;
根据如上定义,假设你创建一个WorkerBee的实例amy,语句如下:
程序代码
amy = new WorkerBee;
amy对象有一个本地的属性,projects。name和dept属性的值并不是amy本地的,是从amy对象的__proto__属性取得的。所以,amy拥有如下属性:
程序代码
amy.name == "";
amy.dept = "general";
amy.projects == [];
现在假设你改变了关联到Employee的原型的name属性的值:
程序代码
Employee.prototype.name = "Unknown"
第一眼看来,你可能认为新的属性值会传递(propagate)到所有Employee的实例。然而,它却没有。
当你创建任何的Employee 对象的时候,那个实例就会为name属性取得一个本地的值(空字符串)。这意味着当你设置WorkerBee的原型为一个新建的Employee对象的时候,WorkerBee.prototype的name属性有一个本地的值。所以,当JavaScript查找amy对象(WorkerBee的一个实例)的name属性的时候,JavaScript在 WorkerBee.prototype中找到了name属性的值。所以它不会进一步顺着原型链访问Employee.prototype。
如果你想要在运行时改变改变对象的属性,并且让这个属性的新值被所有的该对象后代所继承,你就不能在对象的构造函数中定义这个属性。相反,你要将它添加在于构造函数向关联的原型上。例如,假设你将上面的代码修改如下:
程序代码
function Employee () {
this.dept = "general";
}
Employee.prototype.name = "";
function WorkerBee () {
this.projects = [];
}
WorkerBee.prototype = new Employee;
amy = new WorkerBee;
Employee.prototype.name = "Unknown";
在这种情况下,amy对象的name属性就变成了"Unknown"。
就像这些例子展示的,如果你想要让对象的属性有默认值,而且又希望可以在运行时改变这个默认值,你就应该在构造器的原型中设置这个属性,而不是在构造函数中。


猜你喜欢
- CSS的出现使网页制作者在对网页元素的控制方便许多,当然,有利必有弊,CSS只能对颜色、大小、距离等静
- 一.雅黑设计理念 雅黑字体是为微软公司设计的屏幕显示汉字。它具有个性独特、结体优美、识别性强、块状效果好、显示清晰等优点。在当今数字化时代更
- 一、表单验证form1、创建一个新的表单:<form id="id是唯一的,不可重复" name=“可重复”,me
- python批量命名照片的具体代码,供大家参考,具体内容如下废话不多说,上效果图全部代码from tkinter import *impor
- 本文实例为大家分享了Python感知器算法实现的具体代码,供大家参考,具体内容如下先创建感知器类:用于二分类# -*- coding: ut
- 前言前几天切换了node版本,顺带着升级了npm,今天使用nodemon启动node环境时发现报错,提示未安装。没安装就安装了下,结果!冒出
- 如下所示:# -*-coding: utf-8 -*-import pandas as pd#读取csv文件df=pd.read_csv(&
- 一、home页使用frametemplate/home.html<!DOCTYPE html><html lang=&qu
- 1.简介map 是 Golang 中的方便而强大的内建数据结构,是一个同种类型元素的无序组,元素通过另一类型唯一的键进行索引。其键可以是任何
- 多值运动,也就是对于某个对象来说,不仅仅只是其中一个属性值在变化,而是好多个,比如宽,高,字体,透明度等等同时变化当然了,多值运动会产生一个
- 一、状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类1.基本实现//下面以一个开灯程序演示状态模式//灯共用三
- 一、下载1、下载安装包mysql下载路径:https://dev.mysql.com/downloads/file/?id=4967452、
- 彩色圆环更漂亮A.课程内容通过绘制彩色的圆环来学习列表的使用方法、颜色的使用技巧等,通过学习掌握python程序绘制彩色的图形的方法。B.知
- Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列。1)
- 在scipy.linalg的函数中,往往会提供两种参数,其一是check_finite,当为True时将进行有限检查,另一类是overwri
- 前言上回在 用 Go 写一个轻量级的 ssh 批量操作工具 里提及过,我们做 Golang 并发的时候要对并发进行限制,对 goroutin
- 第一种方法:这个是删除单字段图片的代码。比较简单,因为图片字段已经预先存在数据库表的bookpic的字段里面了。 代码如下: <!-
- 最近经常看到各平台里都有Python的广告,都是对excel的操作,这里明哥收集整理了一下pandas对excel的操作方法和使用过程。本篇
- MySQL是一个关系型数据库管理系统,官方网站是http://www.mysql.com/,分为MySQL Enterprise Editi
- Python np.argmin()和np.argmax()函数按照axis的要求返回最小的数/最大的数的下标numpy.argmin(a,