`
robinqu
  • 浏览: 90272 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JavaScript Class模拟基础

阅读更多
Simulating Classes in JavaScript

目前,用js来模拟class是一件非常麻烦的事情,多少有点不优雅。
但是未来的JS肯定会支持class,那么这个语言就是基于class和Prototype的混合继承?到时候会不会越来越混乱呢?笑……


Instance Properties
实例属性
引用
By default, any object property in JavaScript is an instance property.

对象的属性默认状态就是“实例属性”

Instance Methods
实例方法
引用
In JavaScript, an instance method for a class is defined by setting a property in the constructor's prototype object to a function value.

In Java and C++, the scope of instance methods includes the this object.

return width * height;
In JavaScript, however, you've seen that you must explicitly specify the this keyword for these properties:

return this.width * this.height;

If you find it awkward to have to prefix each instance field with this, you can use the with statement (covered in Section 6.18.) in each of your methods.

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


在对象的Prototype对象中顶一个包含方法的属性就可以实现“对象的实例方法”

再诸如Java、C++之类的语言中,实例方法的作用域中包含当前对象,而JavaScript不包括。
所以你要在实例方法中引用实例属性的话就要时刻加上this:

return this.width * this.height;


Class Properties
类属性,也就是在JAVA中由static修饰的变量,是通过定义构造函数对象的内置属性来实现的。
Rectangle.UNIT = new Rectangle(1,1);


Class Methods
类方法,与类属性的实现方式一致

Private Members
私有成员
引用
JavaScript can simulate this using closures (an advanced topic, covered in Section 8.8.), but to do so, the accessor methods must be stored on each object instance; they cannot be inherited from the prototype object.


实现私有变量就是重头戏了,要用到闭包,而且必须和JAVA中一样,通过getter和setter访问他们。在JS中getter和setter必须保存到每个对象的实例中,是不能继承的(否则属性值不就乱了么)。

function ImmutableRectangle(w, h) {
    // This constructor does not store the width and height properties
    // in the object it initializes.  Instead, it simply defines
    // accessor methods in the object.  These methods are closures and
    // the width and height values are captured in their scope chains.
    this.getWidth = function( ) { return w; }
    this.getHeight = function( ) { return h; }
}

// Note that the class can have regular methods in the prototype object.
ImmutableRectangle.prototype.area = function( ) {
    return this.getWidth( ) * this.getHeight( );
};



上例中,getter是在构造函数中定义的,所以确保了它的唯一性。闭包使外界无法通过任何手段来访问原来的定义的“私有变量”。例子中,构造函数的引用已经消失,垃圾回收会回收它,而定义的嵌套函数getWidth和getHeight却保留对原构造函数的引用(意味着这些返回的函数的作用链域中包含原构造函数的活动对象,自然可以访问到其参数值,w和h)

而且如果你只定义了getter,和java中一样,那么这个私有变量是只读的了,所以是ImmutableRectangle。
分享到:
评论

相关推荐

    JavaScript模拟select

    ### JavaScript模拟select控件知识点详解 #### 一、引言 在前端开发中,有时我们需要对浏览器原生的`<select>`元素进行定制化处理,比如实现更丰富的样式或者增加额外的功能。本篇将深入探讨如何使用纯JavaScript...

    JavaScript三种方法模拟双色球抽奖

    JavaScript三种方法模拟双色球抽奖——使用标记、使用Interval、使用Timeout。 详情请参考博文: JavaScript三种方法模拟双色球抽奖——使用标记、使用Interval、使用Timeout ...

    在JavaScript中模拟类(class)及类的继承关系_.docx

    在JavaScript中,尽管ES6之前其语法并不直接支持类(class)的概念,但...随着ES6的引入,JavaScript现在有了更接近传统类语法的`class`关键字,但上述的模拟方法仍然是理解JavaScript面向对象编程基础的重要部分。

    JavaScript Class/Object

    JavaScript所谓的类/对象,是模拟的,因为javascript本身不是面向对象的。本文件(含有注释)精简的介绍了javascript类的属性、方法(包挂静态属性和方法)的应用,还有构造函数的实现,以及类的继承。代码很精简,...

    JavaScript基础与实践教程

    JavaScript是基于原型的面向对象语言,支持类的模拟。对象可以通过字面量语法创建,属性和方法可以直接添加。原型链使得对象可以继承其他对象的属性和方法。ES6引入了类的概念,但其实质仍然是基于原型的。 四、DOM...

    JavaScript ES6中CLASS的使用详解

    在此之前,JavaScript中模拟类主要通过原型链来实现,而ES6中的class为面向对象编程(OOP)提供了一种更简洁、更直观的语法。 在ES6之前,JavaScript本身没有类的概念,它是基于原型的语言。原型对象的属性可以被新...

    JavaScript 实现基础 LinkedList 功能

    在JavaScript中实现LinkedList,我们需要理解其基本概念、操作以及如何用原生JavaScript对象来模拟链表结构。 首先,LinkedList由一系列节点(Node)组成,每个节点包含两部分:数据和指向下一个节点的引用。在...

    Javascript面向对象基础.rar

    JavaScript中的类是通过构造函数来模拟的,它们用于创建具有特定属性和方法的对象。构造函数可以通过`new`关键字实例化: ```javascript function Person(name) { this.name = name; } let person1 = new ...

    Javascript面向对象基础

    下面我们将详细探讨JavaScript面向对象的基础知识。 1. **对象和数据类型**: 在JavaScript中,一切都是对象,包括基本数据类型(如字符串、数字、布尔值)。然而,与数字或字符串不同,对象是键值对的集合,可以...

    Javascript定义类(class)的三种方法详解

    由于 JavaScript 早期版本不直接支持类(class)的概念,开发者需要通过其他方式来实现类似的功能。本文将详细解释三种在JavaScript中定义类的方法:构造函数法、Object.create()法以及极简主义法。 1. 构造函数法 ...

    html+css+javascript模拟QQ登陆窗口效果

    不要忘记添加适当的`id`和`class`属性,以便于CSS和JavaScript操作。 接下来是CSS,用于美化和布局。为了实现仿真度较高的效果,我们需要关注以下几个方面: 1. **样式设定**:设置字体、颜色、边框、背景等基本...

    Javascript等网页基础知识

    在JavaScript中,基础知识点包括变量、数据类型、运算符、控制流(如条件语句和循环)、函数以及事件处理。例如,你可以使用`var`或`let`声明变量,数据类型包括字符串、数字、布尔值、null、undefined等。运算符如...

    javascript面向对象技术基础

    JavaScript 面向对象技术是编程中的核心概念,尤其在Web...以上就是JavaScript面向对象技术的基础知识,包括对象、构造函数、原型、继承、模式等关键概念。掌握这些内容对于编写高效、可维护的JavaScript代码至关重要。

    JS.Class 2.1发布 Ruby风格的JavaScript.zip

    JS.Class 2.1是在2.0基础上的一次重大升级,主要优化了性能,增加了新特性,并修复了一些已知问题。 二、Ruby风格的类定义 JS.Class 2.1的最大亮点就是其Ruby风格的类定义方式。在Ruby中,类定义简洁而直观,同样...

    javascript核心基础

    本教程“JavaScript核心基础”深入探讨了JavaScript的一些关键概念和技术,包括对象编程、闭包、封装和继承,以及类的不同实现方式。 一、JavaScript对象编程 在JavaScript中,对象是一种数据结构,它将数据和操作...

    javascript面向对象包装类Class封装类库剖析.docx

    JavaScript采用基于原型(Prototype)的继承机制,而非类(Class)为基础的继承。这使得JavaScript在处理对象和类的概念时有其独特的灵活性,但也为理解和编写高效代码带来了一定的挑战。 封装是面向对象编程中的一...

    基于javascript 闭包基础分享

    在JavaScript中,函数可以被看作是一等公民(first-class citizens),这意味着函数可以像任何其他对象一样被创建、传递、返回或者赋值给变量。既然函数是对象,它们就可以有自己的属性和方法。在这个基础上,如果在...

    Javascript征途

    书会详细解释如何创建对象、原型链的工作原理以及如何使用class关键字进行类的模拟。 JavaScript的事件驱动模型和异步编程是其独特之处,也是Web开发中的关键。事件监听、事件冒泡和事件委托等概念,以及setTimeout...

    在JavaScript中模拟类(class)及类的继承关系

    然而,JavaScript的设计允许我们通过其他方式模拟出类似类的行为,尤其是在ES6(ECMAScript 2015)引入了class关键字后,模拟类和继承变得更加直观。在深入探讨如何在JavaScript中模拟类和实现继承之前,我们首先...

Global site tag (gtag.js) - Google Analytics