JavaScript面向对象编程(转)

JavaScript 对象从二个精气神对象
世袭属性。全部目的都有原型;原型的富有属性看上去就好像使用它当作原型的那几个对象的性能同样。同理可得就是:全数目的都从她的原型世袭属性。
(each object inherits properties from its prototype卡塔尔. 对象的 prototype
通过它的 constructor function 来定义。JavaScript 里具备的 function
都有几个 prototype
属性。那几个性子初阶是空的,接下去你给她丰裕的其余性质都会被 constructor
创制的目标所具有。 prototype 对象和 constructor 相关联。那表示
prototype
能够用作放置格局甚至其它常量的能够场馆。原型中的属性不会被复制到新成立的指标中去,他们的属性看上去就像对象的品质雷同。那意味着,使用原型能够超级大的裁减四个同类对象占用的内部存储器。
每一个 class 都唯有一个 prototype object,
附带大器晚成套属性。但我们在运作时可能会创建七个类的实例。那么豆蔻梢头旦产生对原型的品质的读写会发生什么样情形?
当你读贰本性质的时候,JavaScript
首先尝试去探求对象自己是还是不是有其生龙活虎天性,若无,接着去追寻原型里面是还是不是有。有的话就回到结果。
而当您写原型的性质的时候,因为五个对象分享原型,分明是不能一贯在原型上進展写操作的。那个时候其实
JavaScript
会在对象上成立三个同名的属性,然后把值写到里面。当你下次读这些天性的时候,JavaScript
一下子就在目的的性质里查找到了,那么就无需去原型里查找了。那时,大家说“对象的天性隐蔽或走避了原型的属性”。

从下边探究看看,其实大家在设计类的时候,只要驾驭叁个准绳:在原型里仅定义一些措施,常数,常量等。做到那一点就不轻巧模糊了。
例子: // Define a constructor method for our class. // Use it to
initialize properties that will be different for // each individual
Circle object. functionCircle { this.x = x;// The X-coordinate of the
center of the circle this.y = y;// The Y-coordinate of the center of the
circle this.r = r;// The radius of the circle } // Create and discard an
initial Circle object. // This forces the prototype object to be created
in JavaScript 1.1. new Circle; // Define a constant: a property that
will be shared by // all circle objects. Actually, we could just use
Math.PI, // but we do it this way for the sake of instruction.
Circle.prototype.pi = 3.14159; // Define a method to compute the
circumference of the circle. // First declare a function, then assign it
to a prototype property. // Note the use of the constant defined above.
function Circle_circumference() { return 2 * this.pi * this.r; }
Circle.prototype.circumference =Circle_circumference; // Define another
method. This time we use a function literal to define // the function
and assign it to a prototype property all in one step.
Circle.prototype.area = function() { return this.pi * this.r * this.r;
} // The Circle class is defined. // Now we can create an instance and
invoke its methods. var c = new Circle; var a =c.area(卡塔尔; var p =
c.circumference(卡塔尔; 内置的类的 prototype. 不光是顾客自定义的类能够有
prototype. 系统内置的类比方 String, Date
也皆某些。并且你能够向她们增加新的法子,属性等。 上面这段代码就对富有的
String 对象加多了四个实用的函数: // Returns true if the last character
is c String.prototype.endsWith = function { return (c == this.charAt }
然后我们就能够相近那样的来调用了: var message = “hello world”;
message.endsWith// Returns false message.endsWith// Returns true

一、引言
 
长久以来,JavaScript在Web开荒中央直属机关接处于被忽略的身价,以至有一定黄金时代部分开辟人士对它产生了误解,以为JavaScript只可是是用来产生都部队分鲜艳成效的华而不实。互连网上传到的低品质的JavaScript代码对此也起到了推进的效能…非常多应用中JavaScript都接受了面向进度的编程格局,代码的可扩大性倒霉,复制粘贴的代码俯拾就是…
 
随着Ajax等手艺的宽泛使用,YUI、Prototype等对JavaScript的选取可谓是不亦乐乎、曲尽其妙。人们才察觉原先JavaScript可以完毕这样强盛的功用,具有那样雅致的布局…

二、准备
1、概念
JavaScript是大器晚成种弱类型语言。满含:
主导项目:数字Number,字符串String,布尔值Boolean;
复合类型:对象Object,数组Array;
工具类型:全局对象Global,日期Date,数学对象Math,正则表达式RegExp,错误对象Error;
出奇类型:函数Function。

此间作者只想说两点:
1)基本数据类型的卷入对象
每一个宗旨数据类型都有一个对应的指标类。能够灵活地促成类型调换。轻巧地说,JavaScript不止援助数字、字符串和布尔值那一个数据类型,还协理Number、String、Boolean类,这么些类是主导数据类型的包装(wrapper卡塔尔。
例子:
var s=”some string”;
var len=s.length;
此间,s保存了三个字符串,原始的字符串值是不会变动的。一个新的String对象被创立了,完结了对长度属性的访谈,之后它就被销毁了。
其余例子:
var a=”some string”;
var b=new String(“some string”);
var c=[“a”,”b”,”c”];
var d=new Array(“a”,”b”,”c”);

alert(typeof a);//string
alert(a instanceof String);//false
alert(a instanceof Object);//false

alert(typeof b);//object
alert(b instanceof String);//true
alert(b instanceof Object);//true

alert(typeof c);//object
alert(c instanceof Array);//true
alert(c instanceof Object);//true

alert(typeof d);//object
alert(d instanceof Array);//true
alert(d instanceof Object);//true

2)Function类型
做为JavaScript的风流倜傥种新鲜种类,大家将看见函数在面向对象编制程序中起到了要命关键的功能。

2.值和援用

类型 复制 传递 比较
数字
布尔值
字符串 不可变的 不可变的
对象 引用 引用 引用
函数 引用 引用 引用
数组 引用 引用 引用

例子:
var s1=”hello”;
var s2=”hell”+”o”;
alert(s1==s2);//true

var d1=new Date();
var d2=new Date();
alert(d1==d2);//false

3.this
在布局函数中,指代新创建的靶子实例;
在指标的办法被调用时,指代调用该方法的对象实例。

4.arguments
arguments属性由解释器创立,用于访问函数对象的每叁个参数。

5.callee,caller
arguments的callee属性获取对正在进行的Function对象的援用;
Function对象的caller属性获取正在调用当前函数的父函数对象。

6.apply,call
互相都是将函数绑定到其余对象上推行的,差异在于调用形式:
apply([thisObj[,argArray]])
call([thisObj[,arg1[,arg2[,[,.argN]]]]])

7.无名函数
(function(a,b){
 return a+b;
 })(1,1);
等价于:
function f(a,b){
 return a+b;
}
f(1,1);

8.null,undefined
null是JavaScript的机要字,表示空值。能够看作Object类型的一个非同一般值。
undefined不是尤为重要字,它是三个全局变量,使用了未定义变量、变量未赋值、void运算符,都会重回“undefined”。

9.constructor
从JavaScript1.1带头,每一种对象都负有二个constructor属性,它援引的是用来起头化该目的的构造函数。

10.prototype
JavaScript1.1引进了原型对象的概念,每四个目的都有一个原型对象,对象可以继续它的原型对象的兼具属性和方式。
要为二个目的的类制订原型对象,必要将结构函数的prototype属性设置为钦定的靶子。之后,固然用布局函数起初化对象时,会自行将点名的对象作为新成立对象的原型对象。

注意:
1)使用原型对象可以减少每一个继承对象的内部存款和储蓄器必要量;
2)就算属性是在对象被创制后才加到它的原型对象中的,对象也能够三回九转这一个后定义的属性。
3)当调用三个目的的贰脾气质时,先在该对象定义内查找该属性,若无该属性才到该目的的原型对象中寻觅,就那样推算。

三、实现
在面向对象编制程序中,大家能够把进度编制程序中的二个个function看作贰个个独门定义的类,函数名即为类名。
1.例子:Circle类
function Circle(radius){
www.hj8828.com, //实例变量
 this.r=radius;
}

//静态变量
Circle.PI=3.14159;

//实例方法
Circle.prototype.area=function(){
 return Circle.PI*this.r*this.r;
}

//静态方法
Circle.max=function(a,b){
 if(a.r>=b.r){
  return a;
 }
 else{
  return b;
 }
}

//调用
var a=new Circle(2);
var b=new Circle(3);
var c=a.area();
var d=Circle.max(a,b);

2.继承
1)大器晚成种持续形式
//这里大家将CircleMore类的prototype指向了一个Circle类实例,
//并扩展了circumference方法。
function CircleMore(radius){
 this.r=radius;
}