`

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

    然而,ES6引入了`class`语法,但其本质仍然是基于`prototype`的继承。 ```javascript function Animal(name) { this.name = name; } Animal.prototype.sayName = function() { console.log(this.name); } ...

    JavaScript类和继承 prototype属性

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

    javascript面向对象总结

    13. **`class`语法**:虽然JavaScript一直以来都是基于函数的面向对象,但ES6引入了`class`语法,提供了一种更简洁的声明类的方式,但实质上仍然是基于原型的。 以上内容主要源自于“javascript面向对象总结”这篇...

    JavaScript语言基础知识点总结十张图

    本文将基于“JavaScript语言基础知识点总结十张图”这一主题,深入探讨JavaScript的基础概念、语法特性以及核心知识点。 1. **变量与数据类型** JavaScript有七种数据类型:Undefined、Null、Boolean、Number、...

    instanceof 和 prototype 关系

    每个函数(在JavaScript中,构造函数本质上也是函数)都有一个`prototype`属性,这个属性指向一个对象,该对象会被用作新创建的对象的原型。当我们通过`new`关键字创建一个对象时,这个对象会自动获取构造函数`...

    JS:prototype用法

    1. **类与对象**:JavaScript虽然本质上是一种基于原型的语言,但在ECMAScript 6中引入了类语法,使面向对象编程更为直观。在本语境中,“类”更多指的是构造函数定义的对象类型,如`Array`、`Boolean`、`Date`等。 ...

    es6 prototype

    每个函数(在JavaScript中,类本质上也是函数)都有一个`prototype`属性,这个属性指向一个对象,该对象的`__proto__`属性指向构造函数的原型。ES6允许直接在类的声明中定义`prototype`对象的方法: ```javascript ...

    js遍历属性 以及 js prototype 和继承

    在JavaScript中,遍历属性、理解`prototype`和掌握...总结,遍历JavaScript对象的属性有多种方法,而`prototype`和继承机制是实现面向对象编程的关键。理解并熟练运用这些概念,将有助于编写更高效、更可维护的代码。

    深入理解javascript prototype的相关知识

    JavaScript中的原型(Prototype)是其面向对象特性的重要组成部分,它是一种实现对象继承的方式。本文将深入探讨`prototype`和`__proto__`的概念,并通过一个类比来帮助理解它们之间的关系。 首先,让我们澄清一下`...

    prototype学习

    ES6引入了`class`语法糖,但实质上还是基于`prototype`机制。`class`的构造函数仍然有一个`prototype`属性,且`class`的实例会指向构造函数的`prototype`。 ```javascript class Person { constructor(name) { ...

    编写javascript插件,来扩展已有的JavaScript功能.zip

    JavaScript插件本质上是具有特定功能的代码模块,它可以被添加到现有的代码库或框架中,以增加新的功能或改进现有功能。编写JavaScript插件通常涉及对原型(Prototype)的理解和利用,这是JavaScript实现面向对象...

    Javascript面向对象编程

    尽管JavaScript本质上是一种基于原型的语言,但它也支持面向对象编程的一些特性,使得开发者能够编写出结构清晰、易于维护的代码。本文将详细介绍JavaScript中的面向对象编程概念和技术,包括类定义、对象创建、继承...

    深入浅出JavaScript对象模型

    #### JavaScript对象的本质 根据ECMA262规范,ECMAScript被定义为一种基于对象的语言而非传统的面向对象语言。这意味着在JavaScript中,对象被视为存储数据的一种大型数组形式,其中每个对象都有一个属性列表,包含...

    详解Javascript中prototype属性(推荐)

    JavaScript中的prototype属性是实现对象继承和共享方法的关键机制。在JavaScript这种基于原型的面向对象语言中,类(Class)的概念并非原始特性,而是通过构造函数(Constructor)和原型链(Prototype Chain)来模拟...

    面向对象JavaScript精要(英文原版pdf)

    类本质上是对构造函数和原型模式的一种语法糖,提供了更简洁的方式来定义类和子类。 #### 四、本书主要内容概述 本书全面覆盖了面向对象编程的基础理论,并结合JavaScript的具体实现进行讲解。 - **第一章:...

    JavaScript通过prototype给对象定义属性用法实例

    总结来说,JavaScript通过prototype给对象定义属性的用法,实质上是一种共享属性和方法的方式,它利用了JavaScript中对象的原型链继承机制。通过prototype,可以为对象的构造函数的原型添加属性或方法,这样所有通过...

    关于Javascript 对象(object)的prototype

    总结来说,JavaScript的`prototype`机制是实现对象继承的基础。函数对象的`prototype`属性用于定义实例化后的对象的行为,而普通对象则通过`__proto__`属性参与到原型链中,实现对其他对象属性和方法的继承。理解这...

    Javascript(OOP).rar_javascript_javascript O_oop javascript

    每个JavaScript对象都有一个内部`[[Prototype]]`链接到另一个对象,通常可以通过`__proto__`或`Object.getPrototypeOf()`访问。通过原型,子对象可以继承父对象的属性和方法。例如: ```javascript var person = ...

    prototype教程

    在JavaScript编程中,原型(Prototype)是理解对象继承机制的关键概念。本教程将深入探讨这个核心特性,帮助开发者更好地利用JavaScript的面向对象特性。 ### 一、原型概述 原型(Prototype)是JavaScript中的一个...

Global site tag (gtag.js) - Google Analytics