- 浏览: 3053230 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
原文:无类语言的OOP(JavaScript描述)
本来是抱着希望想读一下别人对JavaScript的理解,不料一上来就看到了……
觉得特别郁闷,一开始就当头挨上已棒,后面也没什么心机看了。
问题就是“一个函数”是什么。从语言表象看,在我接触到的JavaScript/ActionScript引擎里,下面的代码都总是两个false:
JavaScript: (IE6, IE7, FF2, FF3)
ActionScript: (AVM2)
ECMAScript里“一个函数”本身就包含了code与environment。单纯是code的话,编译时当然能只生成一个版本;外带environment的话就没办法连environment也只保留一份。
后来发觉有人对那段做了反驳:
对【无类语言的OOP(JavaScript描述) 】一贴中第一个代码段的不同意见
嗯这篇扯得有点远。Anyway...不好说不好说。
只是,想起周末看资料的时候,看到有文章提到在语言设计中“syntax matters”。在这里的话,我是觉得发帖时的“语气也很重要”。嗯……
P.S. 参考Professional JavaScript for Web Developers中,3.5一节的内容。
我去 我以为我的理解已经够可以了 没想到你的理解能力比我还差 看看你都说了些神马
这样就两个true;
嘿嘿,这样是两个true,但原因却不是您所解释的那样。
首先是在函数字面量之后加括号的问题。这就是直接调用括号前的函数字面量,于是
等于
其次,JavaScript的函数中如果没有return,或在对某函数某次调用的控制流中没有遇到return就离开了该函数,则函数的返回值是undefined,不是false。
回到您的解释:您修改过代码后,this.turnOn就是true而不是一个函数;比较两个Light实例上的turnOn属性,自然总是相等——它们都是true而已。这与顶楼以及顶楼所引用的原帖中所讨论的不是同一个问题。
本来是抱着希望想读一下别人对JavaScript的理解,不料一上来就看到了……
引用
一. 基础:
建立类。只需声明一个函数作为类的构造函数即可。
建立类。只需声明一个函数作为类的构造函数即可。
function Light (light) { //填充对象属性 this.light = light ? light : 0 this.state = false //对象方法。 //放心,JavaScript 没傻到给每个对象都真去分配一个函数的地步 this.turnOn = function () { this.state = true } }
觉得特别郁闷,一开始就当头挨上已棒,后面也没什么心机看了。
问题就是“一个函数”是什么。从语言表象看,在我接触到的JavaScript/ActionScript引擎里,下面的代码都总是两个false:
JavaScript: (IE6, IE7, FF2, FF3)
<html> <body> <script type="text/javascript"> function Light (light) { this.light = light ? light : 0; this.state = false; this.turnOn = function () { this.state = true; } } var light1 = new Light(100); var light2 = new Light(200); document.write( light1.turnOn == light2.turnOn ); document.write( "<br />" ); document.write( light1.turnOn === light2.turnOn ); </script> </body> </html>
ActionScript: (AVM2)
function Light (light) { this.light = light ? light : 0; this.state = false; this.turnOn = function () { this.state = true; } } var light1 = new Light(100); var light2 = new Light(200); print( light1.turnOn == light2.turnOn ); print( light1.turnOn === light2.turnOn );
ECMAScript里“一个函数”本身就包含了code与environment。单纯是code的话,编译时当然能只生成一个版本;外带environment的话就没办法连environment也只保留一份。
后来发觉有人对那段做了反驳:
对【无类语言的OOP(JavaScript描述) 】一贴中第一个代码段的不同意见
嗯这篇扯得有点远。Anyway...不好说不好说。
只是,想起周末看资料的时候,看到有文章提到在语言设计中“syntax matters”。在这里的话,我是觉得发帖时的“语气也很重要”。嗯……
P.S. 参考Professional JavaScript for Web Developers中,3.5一节的内容。
评论
3 楼
黑白两相望
2011-11-28
司徒正美 写道
<pre>
function Light (light) {
this.light = light ? light : 0;
this.state = false;
this.turnOn = function () {
return this.state = true;
}()
}
var light1 = new Light(100);
var light2 = new Light(200);
document.write( light1.turnOn == light2.turnOn );
document.write( "<br />" );
document.write( light1.turnOn === light2.turnOn );
</pre>
这样就两个true;
因为
……
this.turnOn = function () {
this.state = true;
}
……
相当于
this.turnOn = function () {
this.state = true;
return false;
}
function Light (light) {
this.light = light ? light : 0;
this.state = false;
this.turnOn = function () {
return this.state = true;
}()
}
var light1 = new Light(100);
var light2 = new Light(200);
document.write( light1.turnOn == light2.turnOn );
document.write( "<br />" );
document.write( light1.turnOn === light2.turnOn );
</pre>
这样就两个true;
因为
……
this.turnOn = function () {
this.state = true;
}
……
相当于
this.turnOn = function () {
this.state = true;
return false;
}
我去 我以为我的理解已经够可以了 没想到你的理解能力比我还差 看看你都说了些神马
2 楼
RednaxelaFX
2009-05-31
司徒正美 写道
function Light(light) { this.light = light ? light : 0; this.state = false; this.turnOn = function () { return this.state = true; }() } var light1 = new Light(100); var light2 = new Light(200); document.write( light1.turnOn == light2.turnOn ); document.write( "<br />" ); document.write( light1.turnOn === light2.turnOn );
这样就两个true;
嘿嘿,这样是两个true,但原因却不是您所解释的那样。
首先是在函数字面量之后加括号的问题。这就是直接调用括号前的函数字面量,于是
a = function () { return 2 }()
等于
a = 2
其次,JavaScript的函数中如果没有return,或在对某函数某次调用的控制流中没有遇到return就离开了该函数,则函数的返回值是undefined,不是false。
a = function () { this.b = 1 }() typeof(a) // == undefined b = function (n) { if (n % 2 == 0) return true }(1) typeof(b) // == undefined
回到您的解释:您修改过代码后,this.turnOn就是true而不是一个函数;比较两个Light实例上的turnOn属性,自然总是相等——它们都是true而已。这与顶楼以及顶楼所引用的原帖中所讨论的不是同一个问题。
1 楼
司徒正美
2009-05-30
<pre>
function Light (light) {
this.light = light ? light : 0;
this.state = false;
this.turnOn = function () {
return this.state = true;
}()
}
var light1 = new Light(100);
var light2 = new Light(200);
document.write( light1.turnOn == light2.turnOn );
document.write( "<br />" );
document.write( light1.turnOn === light2.turnOn );
</pre>
这样就两个true;
因为
……
this.turnOn = function () {
this.state = true;
}
……
相当于
this.turnOn = function () {
this.state = true;
return false;
}
function Light (light) {
this.light = light ? light : 0;
this.state = false;
this.turnOn = function () {
return this.state = true;
}()
}
var light1 = new Light(100);
var light2 = new Light(200);
document.write( light1.turnOn == light2.turnOn );
document.write( "<br />" );
document.write( light1.turnOn === light2.turnOn );
</pre>
这样就两个true;
因为
……
this.turnOn = function () {
this.state = true;
}
……
相当于
this.turnOn = function () {
this.state = true;
return false;
}
发表评论
-
Function.prototype.bind
2013-09-24 18:07 0polyfill http://stackoverflow. ... -
Nashorn各种笔记
2013-07-15 17:03 0http://bits.netbeans.org/netbea ... -
JavaScript global properties are bound by name, not by value
2013-06-04 14:42 0function a() { console.log('a1' ... -
PICs and prototypes
2013-05-30 13:10 0In a lot of the implementations ... -
Nashorn notes
2013-05-28 10:44 0Nashorn NodeVisitor: the same a ... -
Building Blocks of a JavaScript Engine
2013-05-23 00:49 0sketches of my new book "B ... -
读《JavaScript语言精髓与编程实践(第二版)》
2013-05-21 00:32 02008年逛书店的时候偶 ... -
V8与c1visualizer
2011-08-21 21:00 0Subject: [v8-dev] Improved c1vi ... -
Rhino的JavaScript与Java的整合
2011-05-05 14:40 0http://www.mozilla.org/rhino/Sc ... -
this = null的杯具
2011-03-09 17:04 0this不允许赋值? FireFox表示吐槽 Chrome却欣 ... -
简单替换URL中查询字符串的参数值的代码
2010-04-11 17:49 6191刚有个需求是要把URL中query部分的一个指定参数的值替换为 ... -
JägerMonkey的组件介绍
2010-03-16 13:00 0David Mandelin JägerMonkey & ... -
眼见为实——V8的隐藏类与inline cache的例子
2010-03-02 13:42 0src/globals.h // State for inli ... -
JavaScript一些难以优化的地方
2010-03-02 08:54 0arguments with eval -
JägerMonkey与Carakan动态更新
2010-02-28 22:08 3044今天读了几篇与JavaScript引擎相关的帖。三篇关于Moz ... -
Opera的JS引擎,Carakan
2009-12-03 01:47 0Wikipedia 引用Presto is a layout ... -
with的陷阱
2009-11-21 18:41 0让eval()全局作用域执行的方法深入研究 用with(win ... -
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩
2009-10-17 02:52 133370(Disclaimer:如果需要转 ... -
再谈Google V8和Webkit Nitro
2009-08-21 18:11 0JavaScriptCore SquirrelFish -&g ... -
把列表里连续的数字合并到连续范围里
2009-06-07 20:46 3388论文写得快疯了嗯。上来换口气。 刚才看到问答频道的一个问题, ...
相关推荐
在无类语言中实现面向对象编程(OOP)与传统类基于的语言有所不同。这类语言通常更灵活,支持动态类型和元编程等特性。JavaScript作为一种典型的无类语言,在实现面向对象编程方面有其独特之处。 ##### 建立类 在...
1. 基于对象的脚本语言:JavaScript 是一种基于对象的脚本语言,面向对象的程序设计(OOP)技术由五个最基本的概念组成:对象、消息、方法、类和继承。 2. 对象的组成:JavaScript 对象由两部分组成:属性...
在实际编程中,OOP被广泛应用于各种语言,如Java、C++、Python、JavaScript等。JavaScript中的OOP主要是基于原型的,但在ES6引入了类的概念后,其语法更接近于传统的类式OOP。在`extoop.js`和`test.js`中,我们可以...
鉴于面向对象编程在JavaScript中的实现与传统语言如Java或C++有所不同,书中可能还会介绍JavaScript特有的OOP特性,如原型继承、对象字面量、工厂模式以及后来的ES6新增的类语法等。 由于内容片段包含了版权声明和...
提到JavaScript的面向对象编程(OOP),它不同于传统的类为基础的OOP,而是基于原型的。在JavaScript中,对象可以直接从其他对象继承属性和方法,无需预先定义类。对象的属性和方法可以动态添加,这提供了很大的灵活...
面向对象编程(Object-Oriented Programming, OOP)引入了类和对象的概念,以提高代码的复用性和可维护性。Java、C++和Python都是广为人知的面向对象语言。它们允许开发者创建和管理对象,封装数据和方法,实现继承...
JavaScript小游戏是一种利用JavaScript编程语言开发的互动娱乐应用。JavaScript,简称JS,是Web开发中不可或缺的一部分,主要用于网页和网络应用的动态化。由于其轻量级、解释型和跨平台的特性,使得JavaScript成为...
另一个指标是TypeScript的出现,TypeScript是Microsoft编写的JS的超集,并支持OOP功能:类,名称空间,模块,静态类型,泛型。 在这个简短的概述中,我将回答问题:如何,为什么以及何时在JavaScript中使用OOP? ...
尽管汇编语言比机器语言更易读,但仍然需要对硬件有深入的理解,编写效率相对较低。 接下来,高级语言的出现彻底改变了编程的格局。在20世纪50年代,FORTRAN(公式翻译)作为第一种广泛使用的高级语言诞生,随后...
尽管JavaScript的类机制与传统面向对象语言有所不同,但通过构造函数、原型链等方式,依然能够实现强大的面向对象编程特性。未来的学习过程中,我们还可以进一步探索继承、封装等更高级的概念,以提升我们的编程技能...
《使用OOP JavaScript和React构建俄罗斯方块游戏的探索》 在编程世界中,经典游戏“俄罗斯方块”常被用作学习新语言或技术的示例。本项目,名为“tetris”,就是一个利用面向对象编程(OOP)的JavaScript和React...
标题 "sloop:S语言OOP:sailboat:" 指涉的是一个关于S语言(主要是R语言)面向对象编程(Object-Oriented Programming, OOP)的项目或库,名为"Sloop",可能寓意其像帆船一样引导开发者在R的OOP海洋中航行。...
在OOP Game Show App中,JavaScript的面向对象特性将被用于组织代码,创建类和对象,以及实现游戏逻辑。 **可能涉及的知识点:** 1. **JavaScript基础**:变量、数据类型、操作符、流程控制、函数、闭包等。 2. **...
3. **ES6类语法**:现代JavaScript提供了更接近传统面向对象语言的类语法,使得定义类和创建对象更加直观。例如: ```javascript class Person { constructor(name, age) { this.name = name; this.age = age; ...
JavaScript,简称为JS,是一种广泛应用于网页和网络应用开发的轻量级编程语言。它主要负责处理客户端的交互,使得网页具有动态性与用户交互性。JavaScript与PHP都是Web开发中的重要工具,但它们在职责上有所不同:...
标题“JavaScript经典面向对象设计”指出了本书的主要内容是关于如何使用面向对象编程(OOP)原则和技术来编写高质量、可扩展且可重用的JavaScript应用程序及库。描述中提到本书相比其他中文资料更为清晰,深入到...
- **面向对象编程**:理解类、继承、封装、多态等OOP原则在JavaScript中的实现方式。 - **异步编程**:熟悉回调函数、Promise、async/await等处理异步操作的技术。 #### Web开发技术 2. **HTML与JavaScript交互*...
面向对象编程(OOP)是现代编程的主流思想,JavaScript虽然不是一种严格的面向对象语言,但它通过对象和原型链实现了OOP的概念。通过构造函数和原型,我们可以创建具有属性和方法的对象实例,实现数据封装、继承和多...