`

Javascript Prototype本质总结

阅读更多


JavaScript是基于对象的,任何元素都可以看成对象。然而,类型和对象是不同的。本文中,我们除了讨论类型和对象的一些特点之外,更重要的是研究如何写出好的并且利于重用的类型。毕竟,JavaScript这种流行的脚本语言如果能够进行良好的封装,并形成一个庞大的类型库,对于重用是非常有意义的。
网上对于prototype的文章很多,一直没明白核心的思想。最后写了很多例子代码后才明白:prototype只能用在类型上。
以下是一些关于类型和对象的例子,大家看完例子后可能更容易理解类型和对象之间的联系:

  例子代码 说明
1 Object.prototype.Property = 1;
Object.prototype.Method = function ()
{
    alert(1);
}

var obj = new Object();
alert(obj.Property);
obj.Method();

可以在类型上使用proptotype来为类型添加行为。这些行为只能在类型的实例上体现。

JS中允许的类型有Array, Boolean, Date, Enumerator, Error, Function, Number, Object, RegExp, String
2 var obj = new Object();
obj.prototype.Property = 1; //Error
//Error
obj.prototype.Method = function()
{
    alert(1);
}

在实例上不能使用prototype,否则发生编译错误
3 Object.Property = 1;
Object.Method = function()
{
    alert(1);
}

alert(Object.Property);
Object.Method();

可以为类型定义“静态”的属性和方法,直接在类型上调用即可
4 Object.Property = 1;
Object.Method = function()
{
    alert(1);
}
var obj = new Object();
alert(obj.Property); //Error
obj.Method(); //Error

实例不能调用类型的静态属性或方法,否则发生对象未定义的错误。
5 function Aclass()
{
this.Property = 1;
this.Method = function()
{
    alert(1);
}
}
var obj = new Aclass();
alert(obj.Property);
obj.Method();

这个例子演示了通常的在JavaScript中定义一个类型的方法
6 function Aclass()
{
this.Property = 1;
this.Method = function()
{
    alert(1);
}
}
Aclass.prototype.Property2 = 2;
Aclass.prototype.Method2 = function
{
    alert(2);
}
var obj = new Aclass();
alert(obj.Property2);
obj.Method2();

可以在外部使用prototype为自定义的类型添加属性和方法。
7 function Aclass()
{
this.Property = 1;
this.Method = function()
{
    alert(1);
}
}
Aclass.prototype.Property = 2;
Aclass.prototype.Method = function
{
    alert(2);
}
var obj = new Aclass();
alert(obj.Property);
obj.Method();

在外部不能通过prototype改变自定义类型的属性或方法。
该例子可以看到:调用的属性和方法仍是最初定义的结果。
8 function Aclass()
{
this.Property = 1;
this.Method = function()
{
    alert(1);
}
}
var obj = new Aclass();
obj.Property = 2;
obj.Method = function()
{
    alert(2);
}
alert(obj.Property);
obj.Method();

可以在对象上改变属性。(这个是肯定的)
也可以在对象上改变方法。(和普遍的面向对象的概念不同)
9 function Aclass()
{
this.Property = 1;
this.Method = function()
{
    alert(1);
}
}
var obj = new Aclass();
obj.Property2 = 2;
obj.Method2 = function()
{
    alert(2);
}
alert(obj.Property2);
obj.Method2();

可以在对象上增加属性或方法
10 function AClass()
{
       this.Property = 1;
       this.Method = function()
       {
              alert(1);
       }
}

function AClass2()
{
       this.Property2 = 2;
       this.Method2 = function()
       {
              alert(2);
       }
}
AClass2.prototype = new AClass();

var obj = new AClass2();
alert(obj.Property);
obj.Method();
alert(obj.Property2);
obj.Method2();

这个例子说明了一个类型如何从另一个类型继承。
11 function AClass()
{
       this.Property = 1;
       this.Method = function()
       {
              alert(1);
       }
}

function AClass2()
{
       this.Property2 = 2;
       this.Method2 = function()
       {
              alert(2);
       }
}
AClass2.prototype = new AClass();
AClass2.prototype.Property = 3;
AClass2.prototype.Method = function()
{
       alert(4);
}
var obj = new AClass2();
alert(obj.Property);
obj.Method(); 这个例子说明了子类如何重写父类的属性或方法。


   以上例子中,关于通过类型实现重用方面,重要的有:
·例子1:JavaScript中允许添加行为的类型
·例子2:prototype使用的限制
·例子3:如何定义类型上的静态成员
·例子7:prototype在重定义类型的成员上的限制
·例子10:如何让一个类型继承于另一个类型
·例子11:如何在子类中重新定义父类的成员
 
可见JavaScript能够实现的面向对象的特征有:
·公有属性(public field)
·公有方法(public Method)
·私有属性(private field)
·私有方法(private field)
·方法重载(method overload)
·构造函数(constructor)
·事件(event)
·单一继承(single inherit)
·子类重写父类的属性或方法(override)
·静态属性或方法(static member)


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/czh_friend/archive/2007/04/16/1566319.aspx
分享到:
评论

相关推荐

    JavaScript类和继承 prototype属性

    prototype属性本质上还是一个JavaScript对象。 并且每个函数都有一个默认的prototype属性。 如果这个函数被用在创建自定义对象的场景中,我们称这个函数为构造函数。 比如下面一个简单的场景: 代码如下: // 构造...

    Javascript中的prototype与继承

    通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性列表。javascript创建对象时采用了写时复制的理念。 只有构造器才具有prototype属性,原型链继承就是创建一个新的指针,指向构造器的...

    RICO 1.1 附 prototype 1.4

    做Ajax的朋友恐怕都听说过rico,这个是新出的 rico 1.1.0稳定版本,rico用到了prototype库,因此压缩包内还附带了prototype 1.4,另外还有RicoAjaxEngine.pdf ,可惜是英文的。 网址是:...

    深入了解javascript中的prototype与继承

    通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性列表。javascript创建对象时采用了写时复制的理念。只有构造器才具有prototype属性,原型链继承就是创建一个新的指针,指向构造器的...

    JavaScript中几个重要的属性(this、constructor、prototype)介绍

    this表示当前对象,如果在全局作用范围内使用this,则指代当前页面对象window,prototype本质上还是一个JavaScript对象,constructor始终指向创建当前对象的构造函数

    javascript 中__proto__和prototype详解

    构造器的实质就是一个函数,下面的问题是:如何通过这个构造器来创建一个对象呢? 答案: new 构造器构造的是对象。 一、所有构造器/函数的__proto__都指向Function.prototype,它是一个空函数(Empty function) ...

    学习javascript面向对象 javascript实现继承的方式

    本文实例为大家介绍了javascript实现继承的6种方式,分享给大家供大家参考,具体内容如下 1、【原型链继承】实现的本质是重写原型对象,代之以一个新类型的实例。实际上不是SubType的原型的constructor属性被重写了...

    javascript new一个对象的实质

    今天在看《悟透JavaScript》的时候,看到作者的描述,“茅厕”顿开。 现摘录如下,作者说的很是清楚: 用 var anObject = new aFunction() 形式创建对象的过程实际上可以分为三步: 第一步是建立一个新对象; 第二步...

    Javascript 中的类和闭包

    有人说javascript也是面向对象的,只是它是prototype based,当然这只是概念上的区别,我不想讨论js是不是面向对象的,关键是想说明虽然javascript的类表现得很像其他语言中的类,但是内部的实现机理确不太一致,如果...

    JavaScript原型继承之基础机制分析

    这一语言功能的本质依赖于 JavaScript 特有的原型链(prototype chain)模式。 所以严格意义上说,JavaScript 是基于原型的面向对象语言。也就是说,每个实例对象都具有一个原型。对象从该原型中继承属性和方法。 1、...

    戏说JS中的原型-Prototype

    什么是原型:在了解原型链之前我们先来看看一个函数在创建过程中做了哪些事情,举一个空函数的例子:当我们在代码里面声明这么一个空函数,js解析的本质是:1、创建一个对象(有constructor属性及[[Prototype]]属性...

    javascript 中的继承实例详解

    javascript 中的继承实例详解 阅读目录 原型链继承 借用构造函数 组合继承 寄生组合式继承 后记 继承有两种方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际的方法。 由于函数没有签名...

    反射器:仅凡人JavaScript反射。 从https:gitlab.comnorthscaler-publicreflector镜像

    该模块的主要输出是一个名为Reflector的类,该类实质上扩展了JavaScript的本机Reflect类,以使从基于类的思想框架中获取有关类的信息更加直观。 如果您喜欢做这种事情,它还允许您向Object.prototype添加一个class...

    JavaScript面向对象继承原理与实现方法分析

    本文实例讲述了JavaScript面向对象继承原理与实现方法。分享给大家供大家参考,具体如下: 1、构造函数、原型和实例的关系 构造函数有一个原型属性prototype指向一个原型对象。 原型对象包含一个指向构造函数的指针...

    JavaScript原型和继承

    前几天看了《再谈js面向对象编程》,当时就请教...当我们在代码里面声明这么一个空函数,js解析的本质是(肤浅理解有待深入):1、创建一个对象(有constructor属性及[[Prototype]]属性),根据ECMA,其中[[Prototype]

    JavaScript原型继承_动力节点Java学院整理

    在传统的基于Class的语言如Java、C++中,继承的本质是扩展一个已有的Class,并生成新的Subclass。 由于这类语言严格区分类和实例,继承实际上是类型的扩展。但是,JavaScript由于采用原型继承,我们无法直接扩展一个...

    Javascript中 toFixed四舍六入方法

    javascript中toFixed使用的是银行家舍入规则。 银行家舍入:所谓银行家舍入法,其实质是一种四舍六入五取偶(又称四舍六入五留双)法。 简单来说就是:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应...

    JScript中的this关键字使用方式补充材料

    并且通过第一种this关键字使用的说明,能让我们更好的理解JavaScript作为Object-Based语言的本质。 一种是和JavaScript类中的定义有关,我们知道当我们定义如下类的时候: function JSClass() { } JSClass....

    谈一谈javascript中继承的多种方式

    JS 是没有继承的,不过可以曲线救国,利用构造函数、原型...console.log(o.__proto__ === Object.prototype) // true 继承的本质 console.log(o.__proto__ === Object); console.log(Object.__proto__ === Function.pr

Global site tag (gtag.js) - Google Analytics