`
wgj830823
  • 浏览: 51218 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

基于对象的JavaScript编程 3

阅读更多

基于对象的JavaScript编程(3

-JavaScript Object-Oriented Programming

                     By-Ryan Frishberg

Constructor

构造器

    所有的对象实例都有一个constructor属性,它返回建立当前对象的Function (既构造函数),例如:

function myConstructor(){  

}  

var str = new String("Some String");  

var obj = new Object();  

var myObj = new myConstructor();  

alert(str.constructor); // the native String() constructor  

alert(String) // the native String() constructor  

alert(obj.constructor); // the native Object() constructor  

alert(Object) // the native Object() constructor  

alert(myObj.constructor); // the user-defined myConstructor() constructor  

alert(myConstructor); // the user-defined myConstructor() constructor

 

    作者建议你去运行一下这段代码,我也强烈建议你去执行以下它。每一个alert都返回了一个方法体(构造器函数),就是这个方法创建了对应的对象。JavaScript的内建函数的构造器的内容返回的是"[native code]"

当你用typeof关键字去验证构造验证器属性的类型时,返回值会是和创建这个对象的方法一样,都是“function”。(这个不难理解,因为构造器本身就是一个function

 

 

alert(typeof str.constructor); // "function"  

alert(typeof String) // "function"  

alert(typeof obj.constructor); // "function"  

alert(typeof Object) // "function"  

alert(typeof myObj.constructor); // "function"  

alert(typeof myConstructor); // "function" 

    看到了吧这段alert全都弹出”function”,原因很简单因为对象的constructor属性是指向创建该对象的构造方法的,实际上它就是一个构造器方法。(有点和上面重复了)。

function myConstructor(){  

 var x = "y";  

 this.x = "x";  

 return x;  

}  

var myObj = new myConstructor();  

alert(myObj.constructor); // the myConstructor() function object  

alert(myObj.constructor()); // "y"

    这段比较有意思哈,呵呵。上面的方法调用的时候返回的是局部变量x,而不是对象的x属性的值。(详细说明一下:myObj.constructor指的是构造器函数,而myObj.constructor() 则调用了该构造器函数,运行一下上面代码就很清楚了)。这样每个对象都有一个构造器函数,同时在JavaScript中函数也是对象,那一个函数的类构造器又是什么呢?(有点绕,还是看代码清楚)

 

alert(myConstructor.constructor);  

alert(myObj.constructor.constructor);  

alert(myConstructor.constructor.constructor);  

alert(myObj.constructor.constructor.constructor);

    上面的代码全都返回内置函数Function()的构造器。

    尽管这个看起来不怎么重要,但是你不觉得很有意思吗?它正好证明了一个事实:构造器既是一种函数对象,同时也是"types of objects”.(作者要表达的意思应该就是构造器既是一个具体的对象也是指这一类对象 赋原文:Constructors are both "types of objects" as well as objects themselves (more specifically, Function objects).这样,Date既是指一个对象也是指这一类对象了,你可以创建一个Date的实例,也可以直接使用它。这点对于内置对象和用户自定义对象来说都是一样的。

    这种特性的实际意义在于,我们同门可以通过一个对象的构造器得出这个对象的类型。下面这些就懒得翻了:We can see whether it's a String object, created from the native String constructor function; whether it's an Object object, created from the native Object constructor function; or whether it's one of our user-defined objects, created from a user-defined constructor function.

 

   构造器函数(constructor())不仅仅是对象的一个方法,同时基本数据类型也有自己的构造器函数。那这个函数返回值是什么呢,实际上在创建一个基本数据类型的实例的时候并没有真正的构造函数运行:

var primitiveString1 = "This is a primitive string";  

var primitiveString2 = String("This is a primitive string");  

var stringObject = new String("This is a String object");  

primitiveString1.prop = "This is a property";   

primitiveString2.prop = "This is a property";  

stringObject.prop = "This is a property";  

alert(primitiveString1.prop) // "undefined"  

alert(primitiveString2.prop) // "undefined"  

alert(stringObject.prop) // "This is a property"  

alert(typeof primitiveString1); // "string"  

alert(typeof primitiveString2); // "string"  

alert(typeof stringObject) // "object"  

alert(primitiveString1.constructor); // "function String(){   

[native code] }"  

alert(primitiveString2.constructor); // "function String(){   

[native code] }"  

alert(stringObject.constructor); // "function String(){   

[native code] }"

 

    可以看到,基本数据类型的String和一个String对象都有相同的构造函数:内置的String()构造器。但是构造函数时基本数据类型拥有的唯一的属性/方法.这样这种类型就有了在内置构造器中定义的方法/属性。就是说基本数据类型只能包含已经定义好的属性和方法,用户不能随意给它添加新的属性。看一个例子,一个基本类型String包含且只包含在它的构造函数定义的属性/方法(当然这些属性/方法在String类的实例中也拥有)

       length

       anchor()

       big()

       bold()

       charAt()

       charCodeAt()

       concat()

       indexOf()

       lastIndexOf()

       sub()

       substr()

       substring()

 

但是一个String型的对象实例就可能拥有它自己独特的属性或方法了,例如:

var myStringObj = new String("This is a String object");  

myStringObj.prop = "This is a property of the object I created";  

alert(myStringObj.prop) // "This is a property of the object I created"

有时你可能需要将一个基本数据类型转换成对象类型。看下面的方法:

function myFunc(param){   

 param.property = "I want to add this property";  

 alert(param.property); // "undefined"  

   如果调用时传入一个基本数据类型的参数,那它就不能完成期望的目标了。而且实际上传入一个对象的话就会比较笨重。

 

 

myFunc(new String("This is a String object"));  

myFunc(new Number(5));

为了解决这个问题,Alex(谁啊?)指出可以这样:

function myFunc(param){  

 param = new param.constructor(param);  

 param.property = "I want to add this property";  

 alert(param.property); // returns "I want to add this property"  

    晕,又要开始晕乎了。先看一下前面的内容,当我们要将一个基本数据类型转换成对象类型时,我们可以这样做:

 

var myNum = 5;  

myNum = new Number(5);

继续:

var myNum = 5;  

myNum = new myNum.constructor(5);

   记得吧myNum.constructor()Number() 实际上是等价的,都调用构造器。这样就不难理解了,呵呵直接用myNum就可以:

 

var myNum = 5;  

myNum = new myNum.constructor(myNum);

    其他的基本数据类型也一样,这样我们就可以给一个方法传入基本数据类型,但是在方法内部我们就可以轻而一举的把它转换成对象,然后操作它的属性/方法什么的。

再来看看Prototype

    我们回过头来再来看看函数对象的prototype属性。继承在Java中是一个众所周知的特性。你会想到吗,在JavaScript中你也可以做到相同的事情。比如,有一个car对象,CorvetteAres是不同类型的轿车,但都是轿车。这样他们就可以从Car对象那里继承到一些基本的属性/方法。

 

    先创建以下要用到的这三个对象:Car,Corvette,Ares。然后再来探讨怎么实现后面两中车对Car的继承。

function Car(color){   

 this.wheels = 4;   

 this.doors = 4;   

 this.color = color;   

 this.speed = 0;   

 this.accelerate = function(){   

   this.speed+=20;   

 }   

 this.brake = function(){   

   this.speed-=20;   

 }   

}   

function Corvette(color){   

 // all of Car properties/methods   

 this.doors = 2;   

 this.color = color;   

 this.accelerate = function(){   

   this.speed+=40;   

 }   

}   

function Ares(color){   

 // all of Car properties/methods   

 this.doors = 2;   

 this.color = color;   

 this.accelerate = function(){   

   this.speed+=10;   

 }   

 this.brake = function(){   

   this.speed-=10;   

 }   

}   

var myCar = new Car("white");   

var myCorvette = new Corvette("black");   

var myAres = new Ares("red");

   Corvette是一款速度很快的跑车,我们设置它的加速度比普通车大一些。Dodge Ares是一辆老车,我们设置它的刹车有点失灵,加速度也小一些。现在我们就可以使用Corvette() Ares() prototype,然后给他们加上所有从Car类型继承过来的特性,然后再加上他们的个性信息。这个过程比较麻烦且不好理解,我们先再来验证一下prototype属性。

    Prototype属性是一个没有任何属性/方法的对象。我们给它添加属性/方法的时候,自动的就给这个对象的所有实例都添加了对应的内容。那么,如果我们不在对象的prototype对象上添加属性/方法,我们可以用别的包含我们想添加到当前对象的属性/方法的对象来替换掉当前对象的prototype对象(竟然搞出一句这么绕的句子,太有成就感了,嘎嘎,你们拍砖吧),闲言少叙,看例子:

 

 

Corvette.prototype.wheels = 4;   

Corvette.prototype.speed = 0;   

Corvette.prototype.brake = function(){   

 this.speed-=20;   

可以简单的用:

Corvette.prototype = new Car();

Ares也同样的设置:

 

Ares.prototype = new Car();

   现在两个子类型的车都包含了Car的属性/方法,当然可以在他们自己的构造函数中覆盖掉某些内容,例如 Corvette 型号车和 Ares 型号车都重写了door 属性为2.现在代码就成这样了:

function Car(color){   

 this.wheels = 4;   

 this.doors = 4;   

 this.color = color;   

 this.speed = 0;   

 this.accelerate = function(){   

   this.speed+=20;   

 }   

 this.brake = function(){   

   this.speed-=20;   

 }   

}   

function Corvette(color){   

 this.doors = 2;   

 this.color = color;   

 this.accelerate = function(){   

   this.speed+=40;   

 }   

}   

Corvette.prototype = new Car();   

function Ares(color){   

 this.doors = 2;   

 this.color = color;   

 this.accelerate = function(){   

   this.speed+=10;   

 }   

 this.brake = function(){   

   this.speed-=10;   

 }   

}   

Ares.prototype = new Car();   

var myCar = new Car("white");   

var myCorvette = new Corvette("black");   

var myAres = new Ares("red");

    现在我们就可以在CorvetteAres的对象中调用accelerate()和brake()这两个继承自父类的方法了。可以看到通过这种方法在JavaScript中不难实现继承。

Wrap-up(这段总结不翻了-。-)

Through this tutorial, I hope you've learned a general understanding of how JavaScript operates. In addition, I hope you've gained a basic knowledge of OOP and an understanding of the power of JavaScript as an object-based language. I suggest that you post any questions you might have in the SitePoint Forums; however, if you can't seem to find an answer to your JavaScript object question, I'd be more than happy to give it a shot if you email me at arielladog@yahoo.com  There have been many people who have helped me write this tutorial. In particular, though, I'd like to thank Alex Vincent, Jason Davis, and Jared for helping me to understand the finer points of JavaScript's object abilities.

 

 

分享到:
评论

相关推荐

    Javascript面向对象编程.

    4. **类(Class)**:ES6引入了类语法糖,使得JavaScript的面向对象更加符合传统面向对象语言的写法,但实际上,这些“类”仍然基于原型实现。 ```javascript class Person { constructor(name) { this.name = ...

    JavaScript基于对象编程

    JavaScript是一种广泛应用于Web开发的轻量级脚本语言,它以基于对象的编程特性而闻名。基于对象编程意味着JavaScript不仅可以创建和操作对象,还可以利用现有对象的属性和方法进行编程。这种模型允许开发者以灵活的...

    基于对象的JavaScript编程 透彻

    JavaScript是一种强大的基于对象的编程语言,它并非严格的面向对象编程(OOP)语言,而是以对象为基础。在JavaScript中,对象是由属性组成的集合,这些属性可以是基本数据类型、其他对象或是函数。JavaScript的五种...

    第4章+JavaScript基于对象编程.pdf

    ### JavaScript基于对象编程的核心知识点 #### 一、对象的概念与特性 在JavaScript中,对象是基本的数据类型之一,它代表了现实世界中的实体,如猫、自行车或是文档中的`document`对象。对象拥有两个核心特性:...

    基于闭包的JavaScript面向对象编程框架.pdf

    1. 闭包(Closure)是一种JavaScript编程技术,用于实现基于类的面向对象编程。 2. 闭包可以用来模拟类的机制,并实现基于类的面向对象编程。 3. 基于闭包的JavaScript面向对象编程框架可以实现类的定义、继承和多态...

    JavaScript面向对象编程指南

    面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它基于“对象”的概念,允许程序员创建数据结构来表示和操作现实世界中的实体。在JavaScript中,OOP主要通过构造函数、原型链、闭包以及类(ES6...

    JavaScript面向对象编程案例

    3. **原型链**:JavaScript中的对象都有一个内置的`__proto__`属性,指向其构造函数的原型对象。原型链允许对象共享属性和方法,实现继承。`prototype`属性是构造函数的一个属性,用于设置实例对象的原型。 4. **...

    JavaScript面向对象编程指南(第2版).rar

    JavaScript的面向对象主要基于三个核心概念:封装、继承和多态。封装是将数据和操作这些数据的方法结合在一起,形成一个独立的单元,即对象。在JavaScript中,对象是键值对的集合,可以使用对象字面量或构造函数创建...

    JavaScript高级编程 pdf

    2. **对象和原型**:JavaScript的面向对象特性基于原型,理解原型链、构造函数和实例化过程对于深入学习至关重要。 3. **闭包**:闭包是JavaScript中的一个重要概念,它允许函数访问并操作外部作用域的变量,同时...

    javascript:对象化编程

    在JavaScript中,尽管它是一种原型基于的语言而不是传统的类(class)驱动的语言,但依然可以实现强大的面向对象功能。 #### JavaScript中的对象 在JavaScript中,一切皆对象。无论是内置类型如字符串、数字还是...

    JAVASCRIPT 面向对象编程精要

    JavaScript是一种基于原型的语言,这意味着它不像传统的面向对象语言(如Java或C++)那样拥有类的概念。在JavaScript中,对象是核心,一切都可以视为对象。JavaScript的对象是动态的,即可以在运行时添加或删除属性...

    JavaScript面向对象编程

    JavaScript面向对象编程是一种基于原型(Prototype)的编程范式,它是动态类型语言,允许开发者创建具有复杂特性的对象。在JavaScript中,面向对象主要通过构造函数、原型链和闭包来实现。以下是对这一主题的详细...

    JavaScript编程精解 (第一版 带书签) 中文PDF扫描版

    《JavaScript编程精解 (第一版 带书签) 中文PDF扫描版》是一本专注于JavaScript(通常简称为JS)编程语言的书籍,涵盖了ES5(ECMAScript 2016标准)的编程技术。这本书适合那些希望提升前端开发技能的读者,特别是...

    javascript编程语言教程

    尽管有一些尝试构建面向对象或基于对象的操作系统,例如Spring、Choices和Clouds等,而且许多操作系统内部使用面向对象的概念(如vnodes),但在应用编程与操作系统开发之间仍然存在越来越大的差距。 ### 总结 1. ...

    javascript编程宝典源代码

    JavaScript编程宝典是一本深入探讨JavaScript语言的权威指南,涵盖了从基础语法到高级特性,再到实战应用的全方位知识。源代码通常包含书中示例、练习和项目,供读者实践和学习。通过研究这些源代码,我们可以更深入...

    突破JavaScript编程实例五十讲

    **JavaScript编程基础** JavaScript是一种广泛应用于网页和网络应用的脚本语言,由网景公司的Brendan Eich在1995年创造。它主要负责客户端的交互,使得网页更加动态和用户友好。本课程“突破JavaScript编程实例五十...

    javascript面向对象编程

    1. **基于对象**:JavaScript中的所有数据都是对象,无论是基本类型如数字、字符串、布尔值,还是更复杂的自定义对象。这种基于对象的特性使得JavaScript具备了丰富的数据处理能力。 2. **封装**:通过函数和作用域...

Global site tag (gtag.js) - Google Analytics