理解javascript函数的关键就是抛弃主流面向对象语言中“类”的观念。
主流的面向对象语言,例如C++,先写好“类”的定义。当需要对象时,用new关键字去划出一片内存来,赋上初值,就有了一个对象(“类”的“实例”)。混淆的来源是javascript语言模仿了面向对象的语法,看到Object,new之类的关键字,很难不让人去联想那些传统的面向对象的经典概念。
我们可以优雅的模仿“类”的观念,但是始终要提醒自己,javascript只有对象,没有类。
//Animal是一个对象 Animal = { createNew: function( bundle ) { var animal = {}; var protect = bundle || {};//bundle传递的是指针,修改protect时外面对象会跟着变(除非不传) protect.sound = 'growl'; protect.makeSound = function(){ return protect.sound; } return animal; } } //Cat也是一个对象 Cat = { createNew: function(mySound) { var protect = {}; var cat = Animal.createNew( protect );//protect会被修改,然后返回空白对象{}给cat protect.sound = mySound; cat.meow = function(){ return protect.makeSound(); };//cat要调用protect中的方法 return cat; } } //javascript区分大小写,通过Cat对象构造一个新的对象赋值给cat var cat = Cat.createNew("meow!"); pt("cat.sound");//cat不能直接访问sound pt("cat.meow()");//通过函数可以访问sound var bigCat = Cat.createNew("meow!meow!meow!"); pt("bigCat.sound");//bigCat也不能直接访问sound pt("bigCat.meow()");//通过函数可以访问sound
调试信息:
cat.sound undefined
cat.meow() meow!
bigCat.sound undefined
bigCat.meow() meow!meow!meow!
[备注] 如果希望大猫(bigCat)小猫(cat)有公共的属性,因为Cat本身也是一个对象,所以可以在Cat中定义对象作为公共属性,并在createNew中增加操纵此公共属性的函数。
模仿“类”的观念让我联想到了东施效颦的典故。东施模仿西施优雅的举止肯定是不能达到西施的水准,但是东施难道就没有自己的特长么?例如,做家务会不会比西施更能干呢?javascript函数最大的好处就是可以赋值给变量,因而我们可以编写“函数的函数”,或者,把函数当参数传来传去,函数也可以有自己的方法,诸如此类。还记得在学习早期结构化的编程语言(例如Fortran和C)时,被纠正说不能传递函数当参数么?
Function.prototype.run=function(){ return "run~~"; } pt("cat.meow.run()");//函数也可以有方法
调试信息:
cat.meow.run() run~~
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索javascript
, 对象
, 面向对象
, 函数
, sound
cat
javascript 深度拷贝、javascript深度克隆、javascript深度解析、javascript 深度学习、javascript 深度遍历,以便于您获取更多的相关知识。