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

Javascript - Prototype Based Language

阅读更多

Javascript - Prototype Based Language

作者:heroboy

  最近看了一下firefox中javascript的实现,虽然源代码看不大懂,但对javascript本身有了进一步的认识。javascript是一门通用的脚本语言,它并不仅仅用在web上,而是作为嵌入的脚本语言使用的。不过我看到js除了在web上并没有很广泛的应用(和lua,python等比较的话),不知道为什么。

Prototype Based VS Class Based

  javascript和c++/Java等一样,是面向对象的语言,不同之处在于c++/Java是class based OO language,而javascript是prototype based OO language。
  在class based OO language中严格区分类和实例(或者说对象);而javascript中只有对象(这点和python也是不同的,在python中Class虽然是一个对象,但是python还是有类Class这个概念的,然后通过这个类创建实例的)。

Runtime Member

  在C++/Java中,由于类是静态的(再编译的时候决定的),所以一个对象有哪些成员函数、成员变量是固定的,不能在运行的时候改变。而在Javascript中,一个对象可以在运行时添加和删除它的成员,你可以这么写:
var Mary = new Object;
Mary.age=10;
Mary.eat=function (food) {/*吃东西*/};
其实Javascript的成员有点类似于Lua 中的成员或者c++中的关联容器,例如下面的c++代码:
void eat(void * food)
{
	/*吃东西*/
}
map<string,void*> Mary;
Mary["age"]=(void*)new int(10);
Mary["eat"]=(void*)eat;
当然上面的代码纯粹乱写,因为c++的变量有类型的,所以只能用void*来代替。
p.s. 实际上在Javascript中,你可以这么访问成员:
Mary["age"]=10; 
var str="write";
document[str]("hello");

Function As Constructor

在Javascript中刚刚创建的Object是没有任何成员的,可以使用一个构造函数来初始化新建的对象。
function Person(name,age)
{
	this.name=name;
	this.age=age;
	this.eat=function (food)//成员函数其实不应该这么写,下面会说明的.
	{
		document.write(this.name+"吃了"+food+"<br>");
	}
}
var Mary=new Person("Mary",10); 
var Tom =new Person("Tom",11); 
Mary.eat("apple");
new操作作了2件事:
1.新建一个Object 。
2.把这个Object作为this调用构造函数(new后面的参数)。

Function Is Also Object

  在Javascript中函数也是一个Object,只不过是一个内建的Object,只不过它的构造函数Javascript本身已经提供,而且可以用特殊的语法来创建Function Object。
function add(x,y)
{
	return(x + y);//Perform addition and return results.
}
var add = new Function("x", "y", "return(x+y)");

  上面两种语法创建add都是一样的,同样你一样可以写add.age=10;,类似于Function还有Array,String,Number等内建的对象。这些内建的对象都有一些特殊的成员,使得它们有的能相加(String,Number,Array等),有的能调用(Function),等等。当然Javascript本身不能重载运算符的。
  现在可以知道上面Person函数中有什么问题了吧!每次新建一个Person的时候都会新建一个Function Object,而eat方法应该是所有Person都共享的,这就要用过prototype来解决。

What''s Prototype

  任何对象都有一个Prototype,Prototype是另一个对象。当访问一个对象的成员的时候,如果这个对象不存在这个成员,那么Javascript会到它的Prototype对象上去找,找不到再到Prototype的Prototype(Prototype也是一个对象所以它也有Prototype)上去找,如此重复,直到不存在Prototype为止(这是特例,你是写不出代码让你的对象的Prototype不存在的)。
  那么如何设定一个对象的Prototype呢?每个Function Object都有一个prototype属性,不过这不是这个函数的Prototype,而是当这个函数作为构造函数的时候,它把prototype属性作为新建对象的Prototype。(请注意上面我写的prototype和Prototype的区别,包括下面要写的)
  所以,只要给Person这个函数的prototype属性增加eat方法,就可以在Mary和Tom中共享这个eat了(可以测试一下Mary.eat==Tom.eat)。上面的代码只要改成:

function Person(name,age)
{
	this.name=name;
	this.age=age;
}
var Mary=new Person("Mary",10);//创建Mary
Person.prototype.eat=function (food)//修改Prototype
			{
			document.write(this.name+"吃了"+food+"<br>");
			}
var Tom =new Person("Tom",11);//创建Tom
Tom.eat("banana");
Mary.eat("apple");//即使Mary先创建,eat方法是后添加的。
或者:
var ClassPerson = new Object;
ClassPerson.eat=function (food){document.write(this.name+"吃了"+food+"<br>");}
function Person(name,age)
{
	this.name=name;
	this.age=age;
}
var Mary=new Person("Mary",10);//创建Mary,Mary的Prototype是默认的(默认的是Object)
Person.prototype=ClassPerson;//改变Prototype
var Tom =new Person("Tom",11);//创建Tom,Tom的Prototype才是ClassPerson.
Tom.eat("banana");
//Mary.eat("apple");//不可以,这时Mary的Prototype和Tom的Prototype不是同一个了。
通过Prototype可以在对象之间共享方法和属性,通过设置一层一层的Prototype可以实现继承,不过不能多重继承。
分享到:
评论

相关推荐

    Object.Oriented.JavaScript

    prototype-based object-oriented programming language. Once dismissed as a toy for designers to make things such as rollover buttons, today this interesting and unique language is back, stronger than...

    javascirpt权威指南中英版

    JavaScript is the programming language of the Web. The overwhelming majority of modern websites use JavaScript, and all modern web browsers—on desktops, game consoles, tablets, and smart phones—...

    Effective JavaScript: 68 Specific Ways to Harness the Power of JavaScript[EPUB版]

    Better ways to use prototype-based object-oriented programming Subtleties and solutions for working with arrays and dictionary objects Precise and practical explanations of JavaScript’s functions ...

    Javascript.Object.Oriented.Programming.pdf

    Get acquainted with the basics of JavaScript language constructs along with object-oriented programming and its application. Learn to build scalable server application in JavaScript using Node.js ...

    Google V8引擎 for .Net3.5 / 4.0

    传统的javascript是动态语言,又可称之为Prototype-based Language,JavaScript继承方法是使用prototype,通过指定prototype属性,便可以指定要继承的目标。属性可以在运行时添加到或从对象中删除,引擎会为运行中的...

    Learning ECMAScript 6(PACKT,2015)

    Use the new prototype-based features introduced by ES6 Execute ES6 in an old non-supported ES6 environment Write asynchronous code using promise to facilitate the writing of better asynchronous code ...

    Javascript算法和数据结构:Javascript算法和数据结构

    一种dynamic , weakly typed , prototype-based语言,具有first-class functions 。 JS是动态的 //Compilation and execution happen together. var propMap = { val : "value" , html : "innerHTML" } ; for ( ...

    Professional Ajax

    Professional Ajax 2nd edition is written for Web application developers looking to enhance the usability of their web sites and web applications and intermediate JavaScript developers looking to ...

    Ajax in Action

    - **Description**: This chapter demonstrates how to implement live search functionality using XSL (Extensible Stylesheet Language). It covers the process of dynamically updating search results as the ...

    js 简单类代码

    在JavaScript里,所有对象都是基于原型的(prototype-based)。这意味着对象直接继承自另一个对象。在这个例子中,world对象直接继承自它的原型对象,而原型对象是JavaScript运行时创建的。 5. JavaScript执行环境...

Global site tag (gtag.js) - Google Analytics