惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
博客园_首页
雷峰网
雷峰网
V
V2EX
博客园 - 司徒正美
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - Franky
月光博客
月光博客
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
T
Tailwind CSS Blog
小众软件
小众软件
博客园 - 叶小钗
美团技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
MyScale Blog
MyScale Blog
Blog — PlanetScale
Blog — PlanetScale
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
人人都是产品经理
人人都是产品经理
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

博客园 - laolaowhn

Clean code that works (simplicity is more complicity than you think 朴素比你想象的更复杂) jQuery in Action 中文版 第一章 jQuery简介 如翻译的不好请原谅 jQuery in Action 中文版 简介 专用卸载工具 Windows Installer Clean Up Uninstall 临时表 中文转拼音源代码 ([^<]*) - laolaowhn - 博客园 IIS6架设网站常见问题及症状举例答疑 - laolaowhn - 博客园 jquery验证表单,可以独立与文框,利jquery动态控制,源代码 vs2005 js 没有反应 - laolaowhn {JS}JavaScript使用正则表达式 JavaScript 正则表达式 验证网址 JavaScript下正则表达式密码强度验证 悟透JavaScript引子 prototype学习心得 prototype源码分析—enumerable Prototype.js的分析 我为什么选择mootools,抛弃了prototype. (mootools 与 prototype 核心代码分析) prototype源码分析
Prototype 框架分析(一)
laolaowhn · 2008-02-23 · via 博客园 - laolaowhn

Prototype 框架分析(一)

Class

关于javascript的面向对象设计可以参看MSDN上的文章《JavaScript使用面向对象的技术创建高级 Web 应用程序》,这样理解起来更加容易。

  • Class的声明

Prototype的帮助文档中关于Class的介绍中有下面的例子:

var Animal = Class.create();

Animal.prototype = {

  initialize: function(name, sound) {

    this.name  = name;

    this.sound = sound;

  },

  speak: function() {

    alert(name + " says: " + sound + "!");

  }

};

var snake = new Animal("Ringneck", "hissssssssss");

snake.speak();

// -> alerts "Ringneck says: hissssssssss!"

//snake.name = "NewRingneck";

//snake.speak();

//如果更改了Animal的名字,它的speak方法仍然是初始化的状态。

//原因就在于js的闭包原理,所以speak方法应该为

//alert(this.name + " says: " + this.sound + "!");

这里Class.create()返回了一个函数,也就是说变量Animal是一个函数。而这个函数的功能就是调用Obj的initialize方法,从而实现类的初始化。因此每个类必须要有initialize方法。

  • Class的继承

Class的继承其实就是更改对象的prototype:

//接着上面的例子

var Dog = Class.create();

//Object.extend方法返回Animal对象,并且给这个Animal增加了

//initialize方法,而根据js运行时可以知道会覆盖先前Animal

//的initialize方法。不过这里Dog.prototype的constructor方法没有改变跟Animal.prototype一致。

//当然如果不用constructor方法也就可以忽略这一点了。

Dog.prototype = Object.extend(new Animal(), {

  initialize: function(name) {

    this.name  = name;

    this.sound = "woof";

  }  

});

var fido = new Dog("Fido");

fido.speak();

// -> alerts "Fido says: woof!"