javascript 的面向对象编程

[size=medium]现在要想掌握好javascript,必须搞懂,搞清楚javascript的对象,函数(function)的概念
其中函数又是比较特殊的对象.javascript很强大,很灵活.但必须深刻理解它.

[b]1.javascript对象是字典[/b]
与其他高级语言(如java)不同,javascript将对象看成是包含"字符串关键字"的字典,
我们可以使用"."或"[]"来设置和获取对象的属性:
var person = {}; //或var person = new Object();
person.age = 12;
person['name'] = 'lulu';
alert(person.name); //print lulu

也可以在var person = {};中定义
var person = {
age: 12,
time: new Date(),
name: 'lulu'
}

[b]2.javascript的函数[/b]
对象一般都有属性跟方法,要理解方法必须先理解javascript的函数
在javascript中,函数跟对象差别比较小,函数实际上是具有与它关联的可执行代码的对象.
普通定义函数的方式:
function func(x){
alert("hello " + x);
}
也可以构建匿名函数赋给变量
var func = function(x){
alert("hello " + x);
}
甚至可以这样(但很少用)
var func = new Function("x", "alert(x);“);

就像对象一样,你可以对函数增加属性
func.name = 'lulu';
func['age'] = 41;

作为对象,函数还可以赋给变量、作为参数传递给其他函数、作为其他函数的值返回,
并可以作为对象的属性或数组的元素进行存储等等

javascript对象与函数中的this
var gObj = {
"name": "touo",
get: function(){
return this.name; //这里的this是指gObj对象
}
}
function say(){
alert(this.greet); //这里的this根据调用者而变.见nObj
}
var nObj = {
"greet": "hello,hi",
sayIt: say //这时函数say里面的this就是指nObj对象了.
}
var bObj = {
"greet": "hehe"
//这里没有调用say方法,而是用下面的方法调用
}
每个函数都有一个call方法
say.call(bObj); //print hehe
//作为函数第一个参数传递给 call 的任何对象都将在函数调用中成为“this”的值

[b]3.使用javascript函数类似构造函数初始化对象本地变量[/b]
function Dog(name){
this.name = name;
this.resp = function(name){
if(this.name == name){
alert("woof");
}
}
}
当我们使用new时会初始化name这个变量
var d1 = new Dog('oo');
var d2 = new Dog('tt');
d1,d2的name变量值不同,这是我们想要的,
但是他们有相同的resp方法副本,这是重复的,可以将resp方法在全局定义
但是如果方法很多就将是个维护灾难.
所以可以使用将讲到的原型方法

[b]4.原型[/b]
在使用 JavaScript 的面向对象编程中,原型对象是个核心概念。在 JavaScript 中对象是作为现有示例(即原型)对象的副本而创建的,该名称就来自于这一概念。此原型对象的任何属性和方法都将显示为从原型的构造函数创建的对象的属性和方法。可以说,这些对象从其原型继承了属性和方法。
在 JavaScript 中,每个函数都有名为“prototype”的属性,用于引用原型对象。此原型对象又有名为“constructor”的属性,它反过来引用函数本身。这是一种循环引用
JavaScript 中的 Object.prototype 是所有原型的最终基础原型。(Object.prototype 的原型是 null)
在此示例中,请记住 Dog.prototype 是对象。它是通过调用 Object 构造函数创建的(尽管它不可见):

Dog.prototype = new Object();

因此,正如 Dog 实例继承 Dog.prototype 一样,Dog.prototype 继承 Object.prototype。这使得所有 Dog 实例也继承了 Object.prototype 的方法和属性。

所以当我们定义原型对象的resp方法后,所有的Dog的对象都具有resp这个方法
Dog.prototype.resp = function(name){
if(this.name == name){
alert("woof"); //这里this指Dog对象,根据对象的不同而变
}
}
[b]
5.闭包[/b]
函数中使用var定义的变量不能直接通过"."号访问, 它的作用域是函数体内.
function makeGreaterThanPredicate(lowerBound) {
return function(numberToCheck) {
return (numberToCheck > lowerBound) ? true : false;
};
}
通过观察函数 makeGreaterThanPredicate 返回的内部匿名函数,可以发现,该匿名内部函数使用 lowerBound,后者是传递给 makeGreaterThanPredicate 的参数。按照作用域的一般规则,当 makeGreaterThanPredicate 退出时,lowerBound 超出了作用域!但在这里,内部匿名函数仍然携带 lowerBound,甚至在 makeGreaterThanPredicate 退出之后的很长时间内仍然如此。这就是我们所说的闭包:因为内部函数关闭了定义它的环境(即外部函数的参数和本地变量)

[b]6.模拟命名空间[/b]
如果要创建一个 JavaScript 库,则可以将它们包装在命名空间内,而不需要定义全局函数和类
var MSDNMagNS = {};

MSDNMagNS.Pet = function(name) { // code here };
MSDNMagNS.Pet.prototype.toString = function() { // code };

var pet = new MSDNMagNS.Pet(“Yammer”);

命名空间的一个级别可能不是唯一的,因此可以创建嵌套的命名空间:

var MSDNMagNS = {};
// nested namespace “Examples”
MSDNMagNS.Examples = {};

MSDNMagNS.Examples.Pet = function(name) { // code };

为命名空间指定更短的别名:
var Eg = MSDNMagNS.Examples;
var pet = new Eg.Pet(“Yammer”);

以上内容参考[url]http://msdn.microsoft.com/zh-cn/magazine/cc163419.aspx[/url]
[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值