`
RednaxelaFX
  • 浏览: 3019393 次
  • 性别: 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描述)

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

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

    JavaScript中的 new 命令

    面向对象编程(Object Oriented Programming,缩写为 OOP)...JavaScript 语言使用构造函数(constructor)作为对象的模板。 “构造函数”,就是专门用来生成实例对象的函数。 它就是对象的模板,描述实例对象的基本结

    JavaScript-Advanced:这些是本学期我解决的一些问题

    通过“ JavaScript高级”,学生可以深入了解JavaScript语言,例如高级语法,使用矩阵,对象,类和高级功能。 学生还将学习更复杂的概念,例如函数上下文,显式绑定,事件循环。 本课程将进一步发展他们的算法思维。 ...

    nest:一个渐进式的Node.js框架,用于在TypeScript和JavaScript(ES6,ES7,ES8)之上构建高效,可伸缩的企业级服务器端应用程序:rocket:

    它使用现代JavaScript,并使用构建(保留与纯JavaScript的兼容性),并结合了OOP(面向对象编程),FP(功能编程)和FRP(功能React编程)的元素。 在,Nest使用 ,但还与广泛的其他库(例如,从而允许轻松使用大量...

    redefine:用于智能对象属性定义的轻量级实用程序

    redefine.js 一个轻量级但功能强大的ES5实用程序。 过时的 是定义类的最新,最能证明未来,积极维护且...在JS世界中确实很常见的一件事,如果不熟悉ES5,那么一件事情就不那么容易解决:来自其他OOP语言JavaScript类概

    UFSC计算机工程:我的项目在毕业时开发。完成。但是文件丢失。

    我将按学期分开课堂上开发的项目第一学期编程逻辑第二学期编程语言I第三学期C中的数据结构第四学期关于人工智能I的项目Cpp中的编程语言II OOP FFT / DFT 算法设计与分析第五学期关于人工智能II的项目控制基础蓝光第...

    prototype-speed-test

    我将自己描述为一个中级JavaScript开发人员,并且一直在尝试使用这种可爱的语言来学习尽可能多的东西。 我很快发现自己想要对我的网站尽可能有效地使用面向对象编程。 尽管对于小型站点,使用极端DRY和抽象代码的...

    simongomes:GItHub资料描述

    语言: PHP , JavaScript , C++ , Java , OOP 前端: HTML5 , CSS3 , Vue , React 后端: Laravel , WordPress , Express , Node 数据库: MySql 技术实践:敏捷,测试驱动开发 :hugging_face: 谢谢...

    写给大家看的面向对象编程书(第3版).[美]Matt Weisfeld(带详细书签).pdf

    6.1.8 创建类模型来描述系统 85 6.2 案例研究:blackjack示例 86 6.2.1 使用CRC卡 87 6.2.2 明确blackjack类 88 6.2.3 明确类的职责 90 6.2.4 UML用例:明确协作关系 95 6.2.5 第一轮CRC卡 98 6.2.6 UML类图...

    matlab代码做游戏-CV:简历

    我不仅对编码充满热情,而且对使用TDD,OOP,MVC等以正确的方式进行编码充满热情。 我学习很快,并且能够相对容易地选择新语言。 我认为,良好的用户界面对于交付真正满足最终用户需求的产品至关重要。 专案 项目 ...

    asp.net知识库

    完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎 正式发布表达式计算引擎WfcExp V0.9(附源码) 运算...

Global site tag (gtag.js) - Google Analytics