不是原型继承那么简单!prototype的深度探索(2)
作者:月影 来源:无忧脚本 发布时间:2008-03-07 12:42:00
2 prototype使用技巧
在了解prototype的使用技巧之前,首要先弄明白prototype的特性。首先,JavaScript为每一个类型(Type)都提供了一个prototype属性,将这个属性指向一个对象,这个对象就成为了这个类型的“原型”,这意味着由这个类型所创建的所有对象都具有这个原型的特性。另外,JavaScript的对象是动态的,原型也不例外,给prototype增加或者减少属性,将改变这个类型的原型,这种改变将直接作用到由这个原型创建的所有对象上,例如:
如果给某个对象的类型的原型添加了某个名为a的属性,而这个对象本身又有一个名为a的同名属性,则在访问这个对象的属性a时,对象本身的属性“覆盖”了原型属性,但是原型属性并没有消失,当你用delete运算符将对象本身的属性a删除时,对象的原型属性就恢复了可见性。利用这个特性,可以为对象的属性设定默认值,例如:
上面的例子通过prototype为Point对象设定了默认值(0,0),因此p1的值为(0,0),p2的值为(1,2),通过delete p2.x, delete p2.y; 可以将p2的值恢复为(0,0)。下面是一个更有意思的例子:
利用prototype还可以为对象的属性设置一个只读的getter,从而避免它被改写。下面是一个例子:
将this.getFirstPoint()改写为下面这个样子:
this.getFirstPoint = function()
{
function GETTER(){};
GETTER.prototype = m_firstPoint;
return new GETTER();
}
则可以避免这个问题,保证了m_firstPoint属性的只读性。
实际上,将一个对象设置为一个类型的原型,相当于通过实例化这个类型,为对象建立只读副本,在任何时候对副本进行改变,都不会影响到原始对象,而对原始对象进行改变,则会影响到副本,除非被改变的属性已经被副本自己的同名属性覆盖。用delete操作将对象自己的同名属性删除,则可以恢复原型属性的可见性。下面再举一个例子:
注意,以上的例子说明了用prototype可以快速创建对象的多个副本,一般情况下,利用prototype来大量的创建复杂对象,要比用其他任何方法来copy对象快得多。注意到,用一个对象为原型,来创建大量的新对象,这正是prototype pattern的本质。
下面是一个例子:
除了上面所说的这些使用技巧之外,prototype因为它独特的特性,还有其它一些用途,被用作最广泛和最广为人知的可能是用它来模拟继承,关于这一点,留待下一节中去讨论。


猜你喜欢
- 本文实例讲述了Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法。分享给大家供大家参考,具体如下:Matplot
- 前言前面我们已经介绍了 python面向对象入门教程之从代码复用开始(一) ,这篇文章主要介绍的是关于Python面向对象之设置对
- 目录1 figure1.1 创建figure1.2 figure的常用设置1.2.1 set方法通用设置1.2.2 设置figure标题1.
- 原因是dict.keys()的返回结果不再是一个list了Python3的keys(), values(), items()返回的都是迭代器
- 引言目前Python2和Python3存在版本上的不兼容性,这里将列举dict中的问题之一。下面话不多说,来看看详细的介绍:1. Pytho
- 实现1)有相同的数据,直接返回(返回值:0);2)有主键相同,但是数据不同的数据,进行更新处理(返回值:2);3)没有数据,进行插入数据处理
- 本文实例讲述了Python编程入门之Hello World的三种实现方式。分享给大家供大家参考,具体如下:第一种方式:$python>
- 淘宝招聘的一个css题目:css样式控制div水平垂直居中方法;<!DOCTYPE html PUBLIC "-//W3C/
- xml.etree.ElementTree可以通过支持的有限的XPath表达式来定位元素。语法ElementTree支持的语法如下:语法说明
- 今天主要来实现一个权限管理系统,它主要是为了给不同的用户设定不同的权限,从而实现不同权限的用户登录之后使用的功能不一样,首先先看下数据库总共
- 定义一个变量,直接输出会输出变量的属性,并不能输出变量值。那么怎么输出变量值呢?请看下面得意import tensorflow as tf
- 一,引言开发环境:Pycharm操作系统:Windows 10Pyhon版本:3.9.9需要自行安装Pygame 3(必须)和Python(
- 先给大家介绍下python中format函数,在文章下面给大家介绍python.format()函数的简单使用---恢复内容开始---pyt
- sysbench是一款非常优秀的基准测试工具,它能够精准的模拟MySQL数据库存储引擎InnoDB的磁盘的I/O模式。因此,基于sysben
- 什么是双端队列双端队列是与队列类似的有序集合。它有一前、一后两端,元素在其中保持自己的位置。与队列不同的是,双端队列对在哪一端添加和移除元素
- 本文实例讲述了Python大数据之使用lxml库解析html网页文件。分享给大家供大家参考,具体如下:lxml是Python的一个html/
- 1 map使用1.1 map定义map是一种无序的集合,对应的key (索引)会对应一个value(值),所以这个结构也称为关联数组或字典。
- 在做项目的时候因为数据比较多,一次性全部渲染的话会花费较多的时间,所以,想到每一次渲染10条数据也想过每一次获取十条数据然后显示就行了,就目
- 前面我们用python实现了贪吃蛇、坦克大战、飞船大战、五子棋等游戏今天我们用python来实现一下扫雷游戏本游戏代码量和源文件较多可以从我
- #!/usr/bin/env python# -*- coding:utf-8 -*-# *************************