`
RednaxelaFX
  • 浏览: 3038842 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

读《无类语言的OOP(JavaScript描述)》

阅读更多
原文:无类语言的OOP(JavaScript描述)

本来是抱着希望想读一下别人对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;

                }

我去 我以为我的理解已经够可以了 没想到你的理解能力比我还差 看看你都说了些神马
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;

                }

相关推荐

    无类语言的OOP(JavaScript描述)

    在无类语言中实现面向对象编程(OOP)与传统类基于的语言有所不同。这类语言通常更灵活,支持动态类型和元编程等特性。JavaScript作为一种典型的无类语言,在实现面向对象编程方面有其独特之处。 ##### 建立类 在...

    JavaScript语言的特性和应用.pdf

    1. 基于对象的脚本语言:JavaScript 是一种基于对象的脚本语言,面向对象的程序设计(OOP)技术由五个最基本的概念组成:对象、消息、方法、类和继承。 2. 对象的组成:JavaScript 对象由两部分组成:属性...

    EX OOP 编程

    在实际编程中,OOP被广泛应用于各种语言,如Java、C++、Python、JavaScript等。JavaScript中的OOP主要是基于原型的,但在ES6引入了类的概念后,其语法更接近于传统的类式OOP。在`extoop.js`和`test.js`中,我们可以...

    Object-oriented-javascript

    鉴于面向对象编程在JavaScript中的实现与传统语言如Java或C++有所不同,书中可能还会介绍JavaScript特有的OOP特性,如原型继承、对象字面量、工厂模式以及后来的ES6新增的类语法等。 由于内容片段包含了版权声明和...

    悟透JavaScript javascript 圣经

    提到JavaScript的面向对象编程(OOP),它不同于传统的类为基础的OOP,而是基于原型的。在JavaScript中,对象可以直接从其他对象继承属性和方法,无需预先定义类。对象的属性和方法可以动态添加,这提供了很大的灵活...

    高级语言的分类.txt

    面向对象编程(Object-Oriented Programming, OOP)引入了类和对象的概念,以提高代码的复用性和可维护性。Java、C++和Python都是广为人知的面向对象语言。它们允许开发者创建和管理对象,封装数据和方法,实现继承...

    javaScript小游戏

    JavaScript小游戏是一种利用JavaScript编程语言开发的互动娱乐应用。JavaScript,简称JS,是Web开发中不可或缺的一部分,主要用于网页和网络应用的动态化。由于其轻量级、解释型和跨平台的特性,使得JavaScript成为...

    matlab中绿色的代码什么意思-JavaScriptOOP:如何以及何时在JavaScript中使用OOP?

    另一个指标是TypeScript的出现,TypeScript是Microsoft编写的JS的超集,并支持OOP功能:类,名称空间,模块,静态类型,泛型。 在这个简短的概述中,我将回答问题:如何,为什么以及何时在JavaScript中使用OOP? ...

    用英文写一篇短文介绍计算机语言的发展历史和特点,要求简单介绍机器语言、汇编语言、高级语言的简单发展历程和各自的特点。

    尽管汇编语言比机器语言更易读,但仍然需要对硬件有深入的理解,编写效率相对较低。 接下来,高级语言的出现彻底改变了编程的格局。在20世纪50年代,FORTRAN(公式翻译)作为第一种广泛使用的高级语言诞生,随后...

    由浅到深了解JavaScript类.doc

    尽管JavaScript的类机制与传统面向对象语言有所不同,但通过构造函数、原型链等方式,依然能够实现强大的面向对象编程特性。未来的学习过程中,我们还可以进一步探索继承、封装等更高级的概念,以提升我们的编程技能...

    tetris:使用OOP JavaScript和React构建的俄罗斯方块,可在控制台和浏览器中播放

    《使用OOP JavaScript和React构建俄罗斯方块游戏的探索》 在编程世界中,经典游戏“俄罗斯方块”常被用作学习新语言或技术的示例。本项目,名为“tetris”,就是一个利用面向对象编程(OOP)的JavaScript和React...

    sloop:S语言OOP:sailboat:

    标题 "sloop:S语言OOP:sailboat:" 指涉的是一个关于S语言(主要是R语言)面向对象编程(Object-Oriented Programming, OOP)的项目或库,名为"Sloop",可能寓意其像帆船一样引导开发者在R的OOP海洋中航行。...

    oop-game-show-app:团队树屋全栈JavaScript技术学位的第四个项目

    在OOP Game Show App中,JavaScript的面向对象特性将被用于组织代码,创建类和对象,以及实现游戏逻辑。 **可能涉及的知识点:** 1. **JavaScript基础**:变量、数据类型、操作符、流程控制、函数、闭包等。 2. **...

    javascript面向对象

    3. **ES6类语法**:现代JavaScript提供了更接近传统面向对象语言的类语法,使得定义类和创建对象更加直观。例如: ```javascript class Person { constructor(name, age) { this.name = name; this.age = age; ...

    javascript 100li

    JavaScript,简称为JS,是一种广泛应用于网页和网络应用开发的轻量级编程语言。它主要负责处理客户端的交互,使得网页具有动态性与用户交互性。JavaScript与PHP都是Web开发中的重要工具,但它们在职责上有所不同:...

Global site tag (gtag.js) - Google Analytics