[译作]Class in Jscript Part I

【原文地址】 Classes in Jscript - Part I

【原文发表日期】 Monday, September 24, 2007 9:23 AM by don.raman

我是Ritesh Parikh,最近刚转入Jscript Team作一名SDET(译注:我也不知道SDET是什么样的岗位:()。我刚接触Jscript时,我有很多的疑问。其中一个就是 Jscript是否支持面向对象?(译注:这里的Jscript是MS所实现的Javascript,由于MS的Jscript完全兼容于Javascript 1.5,并在此基础上,针对IE做了一些扩展。这个系列里,介绍的内容实际上是Javascript 1.5中对面向对象支持。因此这些内容适合于我们目前广泛意义上的Javascript)

通常情况下,一种语言要支持面向对象的能力,必须具备以下的能力:

l 一种将相关函数组织在一个模块中,并封装他们实现细节的机制。比如:类。

l 一种重用函数,广泛意义上的继承机制。

l 一种逻辑上做相同事情,但却有不同实现的机制。我们通常称之为多态机制。

JScript支持以上所有的机制。在这篇博客中,我将会介绍Jscript是如何支持定义一个类的。

Jscript并不支持一般意义上的“类”,这就决定了它与传统上的面向对象语言,如C++或者JAVA有很大的不同。Jscript不支持传统意义上的类继承,取而代之的是一种利用prototype技术来实现(模拟)类的继承。

如果Jscript不支持一般意义上的类,那它是如何来支持定义“类”,并创建实例的呢?这就是我这篇博客将要解释的内容。

Jscript中并不支持与传统语言一模一样的类的概念,但是它使用构造器函数(constructor function)和prototype对象来模拟“类”。

让我们先来定义一个这篇博客中将要用到的几个关键词:

类(class):在传统的面向对象语言中,它是定义了对象的结构,包括对象包括的属性,属性的类型和对象的操作方法。在Jscript中,并没有这种类型的定义。(译注:在Jscript中并没有直接支持定义这样的类)

构造器函数(Constuctor functions):能够被new关键字初始化的函数称为构造器函数或简称为构造器。它的工作就是初始化一个带任意属性的对象,这个对象在使用new关键字后被返回。(译注:我不也不清楚该如何翻译这个概念,它可以这样理解:它本身就是一个函数,同时它可以被认为是一个对象的构造器。)

Prototype对象:在Jscript中,除了Object.prototype,每个对象(类型层面上,不是实例)都有带有一个被称为prototype对象的引用。在prototype里的所有属性(和方法),都会出现在每个对象的实例中。(译注:理解prototype的概念,对理解Jscript中的继承和性能提升有很重要的意义。)

带着这些信息,我们来开始使用Jscript来实现第一个“类”。

我们要来定义一个带有带有高和宽的矩形,并且要提供一个计算其面积的area方法。

首先,我们要来定义一个类,但Jscript中不支持Class关键字。那我们该如何做呢?看下面的代码。

定义一个构造器函数来初始所需的数据:

function Rectangle (ht, wt) {

            this.height = ht;

            this.width=wt;

}

接下来是创建Rectangle对象

var rect1 = new Rectangle(5,10);

var rect2 = new Rectangle(2,4);

然后定义一个函数来计算Rectangle的面积

function computeArea(rObj) {

            return rObj.height * rObj.width;

}

调用该函数来计算面积:

var rectArea = computeArea(rect1); //will return 50.

但是这样做就不是一个严格意义上的面向对象了。一种更好的办法是在Rectangle对象中调用一个函数来直接返回它的面积。在类中添加一个函数是可行的,加上这个函数的话,Rectangle的构造器变成了这样:

function Rectangle (ht, wt) {

            this.height = ht;

            this.width=wt;

this.area = function() { return this.height * this.width;}

}

然后我们就可以这样调用计算它的面积了:

var rect1Area = rect1.area(); // rect1.area() will return 50.

var rect2Area = rect2.area(); // rect2.area() will return 8.

但这样还不是一个最理想的面向对象的实现,还有更好的方式。在这里矩形对象中会有会个属性,height, width和area。height, width对于每个矩形对象实例来说,可能会有不同的值,但是area对于每个对象实例来说使用的都是相同的函数原形。这就意味着area方法对每个矩形对象实例来说是可以共享的,那我们为什么不那么做呢?

我们可以做这张图片中得知prototype对象源来。(译注:图?)

我们把area定义为Rectangle的一个属性:

Rectangle.prototype.area = function() {return this.height * this.width;}

rect1.area(); // will return 50.

rect2.area(); // will return 8.

从上面我们所做的可以总结出以下的一些信息:

构造器会为类提供一个名称,和初始化每一个类的实现的属性。Prototype对象与构造器有关,prototype对象里定义的任何属性都被每个由于构造器实例化的对象所继承。因此prototype对象是一个最理想地方来存储像area这个所有对象都相同的属性。(常量)

这样做具有以下一些优点:

所有相同的方法(一次定义所有实例共享)被定义在prototype对象中可以被所有的实例共享。它可以大大减小内存的开销。

当一个属性在对象实例被创建之后被加在prototype对象中。那么这个对象实例同样也会继承这些新加的属性。

尽管所有的对象都能顺利的从prototype对象中读取属性,但是却无法修改它们,为什么会这样呢?

如果通过rect1(实例)我们可以修改area属性,那么势必其它的对象实例(像rect2, rect3…)在调用area属性时也一样会受到影响。尽管如此,我们仍然可以在对象的prototype的生命周期内来修改它本身的属性,但不是在对象的实例上。当我们试图在对象的实例上修改prototype属性时,它的结果是在对象实例中动态的添加这个属性以覆盖prototype的相同属性。

这只是一个开始,在接下来的文章中,我会来讨论实例属性和静态属性(类属性),实体方法和静态方法(类方法)。此外,我们还会来研究一下数据是如何被封装和继承的。

希望你喜欢这篇博客。

Thanks,

Ritesh

SDET, JScript Team

阿不 译

转载于:https://www.cnblogs.com/hjf1223/archive/2007/10/15/924836.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三课 SVM(2)

1 线性可分的数据集 1.1 超平面 SVM的思想是找到最大间隔的分隔超平面。 在两个分类中,找到能够一条线,以最好地区分这两个分类。这样如果有了新的点,这条线也能很好地做出分类。 这样的线在高维样本中的时候就叫做超平面。 1.2 几何间隔与…

musql-mmm

http://mysql-mmm.org/转载于:https://www.cnblogs.com/fanweixiao/archive/2010/11/05/1870267.html

《C Traps and Pitfalls》 笔记

这本书短短的100多页,很象是一篇文章。但是指出的很多问题的确容易出现在笔试的改错题中--------------------------------------------------------------------第1章 词法陷阱1.1 和 1.3 词法分析的"贪心法则"编译器从左到右读入字符,每个符…

spring mvc学习(53):回顾和springmvc返回值类型总结

媒体类型 MIME媒体类型(简称MIME类型)是描述报文实体主体内容的一些标准化名称(比如,text/html、image/jpeg)。 因特网有数千种不同的数据类型,HTTP仔细地给每种要通过web传输的对象都打上了名为MIME类型的…

2019hdu多校1

1009 考虑贪心&#xff0c;暴力枚举一位。 $o(676n)$ #include<bits/stdc.h> using namespace std; const int N1e5333; int n,m,zl; int pos[26],cnt[N],t[26],az[N]; char s[N],st[N]; int l[N],r[N],nx[N],zzq[26]; int main(){ios::sync_with_stdio(0);//freopen(&qu…

关于梅花雪的js树

最近一段时间&#xff0c;为了学习java&#xff0c;天天在看别人的框架&#xff0c;为了实现一颗树&#xff0c;找到了一个改写梅花雪的js&#xff0c;下面是一个基本的结构<% page language"java" import"java.util.*" pageEncoding"GBK"%&g…

总和最大区间问题

题目和解题思路来源于吴军著作《计算之魂》。本题目是例题1.3。 文章目录1 问题描述2 解题思路2.1 三重循环2.2 两重循环2.3 分治法2.4 正反两遍扫描的方法2.5 再进一步&#xff0c;假设失效3 应用动态规划1 问题描述 总和最大区间问题&#xff1a;给定一个实数序列&#xff0…

spring mvc学习(54):简单异常处理

引入jar包 pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">…

【原】docker部署单节点consul

docker下部署单节点的consul&#xff0c;最重要的是在run consul时&#xff0c;配置-bootstrap-expect1 docker run --name consul1 -d -p 5902:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 10.109.30.246:5901/daily_docker/consul:1.4.5 agent -server -boots…

learning to rank评价指标

文章目录1 准确率Mean average precision1.1 定义1.2 计算2 NDCG(Normalized Discounted Cumulative Gain)2.1定义2.2 例子1 准确率Mean average precision 1.1 定义 Precision at position k (Pk)是一个衡量排名前k位的方法&#xff0c;使用两个级别(相关的和不相关)的相关性…

Re: 社团改革还让不让人活了?

好&#xff0c;说到换位思考&#xff0c;说到服务&#xff0c; 我说一个学校应该给我们社团&#xff08;跑步爱好者协会&#xff09;做的一项最基本的服务── 体检&#xff01; 马拉松年年报名年年体检&#xff0c;但是校医院从来就没有肯为我们做过体检。 马拉松的体检并不复…

spring mvc学习(55):简单异常处理二

引入jar包 pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">…

深入学习linux socket编程之select

很多天之前都说学习关于select和poll的知识了&#xff0c;但是由于既要工作&#xff0c;又要准备论文。都忙不过来&#xff0c;今天终于能抽出一天的时间把select的相关知识和程序给实现了一遍。 select系统调用是用来让我们的程序监视多个文件句柄(file descriptor)的状态变化…

Jelinek-Merer与Absolute discounting 平滑方法

Jelinek-Merer Jelinek-Merer平滑方法的基本思想是利用低元n-gram模型对高元n-gram模型进行线性插值。 PML(wi∣wi−1)c(wi,wi−1)c(wi−1)P_{ML}(w_i|w_{i-1})\dfrac{c(w_i,w_{i-1})}{c(w_{i-1})}PML​(wi​∣wi−1​)c(wi−1​)c(wi​,wi−1​)​ c(wi,wi−1)c(w_i,w_{i-1}…

超级实用且不花哨的js代码大全

****************************************************************&#xff08;一&#xff09;常用元素&#xff0c;对象&#xff0c;事件&#xff0c;技巧事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcEl…

phpMyAdmin 配置

下载&#xff1a;http://downloads.sourceforge.net/project/phpmyadmin/phpMyAdmin/4.0.2/phpMyAdmin-4.0.2-all-languages.tar.bz2?rhttp%3A%2F%2Fsourceforge.net%2Fprojects%2Fphpmyadmin%2F&ts1370058054&use_mirrorncu 输入用户名和密码后点击“执行”&#xff…

三种平滑方法

为了理解《LETOR: A benchmark collection for research on learning to rank for information retrieval》中提出的数据特征中的三个&#xff1a;LMIR.ABS、LMIR.DIR、LMIR.JM的计算方法&#xff0c;我查阅了很多资料。前面一篇博客是理解。这一篇也是。这篇博客的内容来自《A…

控制台读写

program Project1;{$APPTYPE CONSOLE}varstr: string; beginWriteln(请输入&#xff1a;);Readln(str);Writeln(你输入的是&#xff1a; str);Readln; end.转载于:https://www.cnblogs.com/del/archive/2007/11/21/967013.html

基于Chromium构建Chrome WebBrowser for .net 控件(还有点心得体会)

http://blog.csdn.net/lllllllllluoyi/article/details/8540054 首先向360说句sorry&#xff0c;在2011年360极速浏览器出现的时候我去他们论坛里骂过。为什么要到歉呢&#xff0c;因为2012年我把我们公司使用IE WebBrowser改为Chrome控件了&#xff0c;中间遇到的辛酸使我明白…

我们“老实”么?

我们“老实”么&#xff1f; 不知道现在的人&#xff0c;对老实这个词语是怎样的看法。“聪明”的人应该觉得那是个贬义词吧&#xff0c;因为他们总是在利用那些他们认为的“老实”人&#xff0c;有好事的时候他们想到的是那些他们畏惧或者讨好自己的人&#xff0c;有麻烦的时候…