javascript: 基于原型的面向对象编程
Douglas Crockford指出javascript是世界上最被误解的编程语言。由于javascript缺少常见的面向对象概念,许多程序猿认为javascript不是一个合适的语言。我在做第一个javascript项目时候也发现不能将代码放在一个类中。其实大部分程序猿不知道javascript可以面向对象。
浏览器大战时代,Netscape的执行官招来了一个叫Brendan Eich的聪明人,发明了livescript(就是现在的javascript)语言,用来运行在浏览器端。它不像c++和java一样基于类,而是基于原型继承模型设计的。 OOP非常适合livescript这种动态语言。
由于当时市场影响,这种新的语言需要看起来像java。java在当时非常耀眼流行,Netscape的执行官希望新语言是”java的小兄弟“。这就是为啥新语言叫javascript。
JavaScript and prototype-based OOP
下面是javascript的oop例子,先来搞出一个animal的对象:
var genericAnimal = Object.create(null);
- 1
Object.create(null)创建空对象。下面往这个新对象上添加新属性和方法:
genericAnimal.name = 'Animal';
genericAnimal.gender = 'femal';
genericAnmal.description = function () {
return 'Gender: ' + this.gender + '; Name: ' + this.name;
};
- 1
- 2
- 3
- 4
- 5
genericAnimal就是一个对象,可以这样使用:
console.log(genericAnimal.description());
- 1
我们可以使用genericAnimal作为原型,创建其他对象,就像拷贝对象(cloning the object):
var cat = Object.create(genericAnimal);
- 1
我们创建了cat对象,cat对象是genericAnimal的clone版。将cat对象作为原型,创建其他对象:
var colonel = Object.create(cat);
colonel.name = 'Colonel Meow';
var puff = Object.create(cat);
puff.name = 'Puffy';
- 1
- 2
- 3
- 4
- 5
puff对象可以使用“父对象”继承来的属性和方法:
console.log(puff.description());
//Gender: female; Name: Puffy
- 1
- 2
The new keyword and the constructor function
javascript有new关键字和构造函数的感念。
function Person(name) {
this.name = name;
this.sayName = function() {
return "Hi, I'm " + this.name;
};
}
var adam = new Person('Adam');
- 1
- 2
- 3
- 4
- 5
- 6
- 7
实现继承有点复杂, Ninja对象继承Person对象:
function Ninja(name, weapon) {
Person.call(this, name);
this.weapon = weapon;
}
Ninja.prototype = Object.create(Person.prototype);
Ninja.prototype.constructor = Ninja;
- 1
- 2
- 3
- 4
- 5
- 6
Understanding delegation and the implementation of prototypes
使用Object.create创建新对象时候,传入的对象成了新对象的原型。每个对象都有默认的__proto__属性来记录原型。举例说明:
var genericAnimal = Object.create(null);
// genericAnimal.__proto__ points to null
- 1
- 2
使用genericAnimal作为原型创建一个新的空对象:
var rodent = Object.create(genericAnimal);
rodent.size = 'S';
var capybara = Object.create(rodent);
//capybara.__proto__ points to rodent
//capybara.__proto__.__proto__ points to genericAnimal
//capybara.__proto__.__proto__.__proto__ is null
- 1
- 2
- 3
- 4
- 5
- 6
capybara对象虽然没有size属性,但是它可以在原型链上查找size属性:当调用capybara.size时,首先在capybara对象的本身属性上查找,如果没有找到,则会去capybara.__proto__所指向的原型上去查找。如果在capybara.__proto__也没有找到,则继续在capybara.__proto__.__proto__上查找。
Creating Object.create
如果有些浏览器不支持Object.create,那么需要自己实现了:
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
http://blog.csdn.net/bdss58/article/details/51284944
javascript: 基于原型的面向对象编程的更多相关文章
- JavaScript - 基于原型的面向对象
JavaScript - 基于原型的面向对象 1. 引言 JavaScript 是一种基于原型的面向对象语言,而不是基于类的!!! 基于类的面向对象语言,比如 Java,是构建在两个不同实体的概念之上 ...
- javascript基于原型实现面向对象
传统的OO语言有类的概念,但js(ES5)却是基于原型实现的面向对象. 原型是?我们创建的每一个函数都会有一个原型(prototype)属性,这个属性是一个指针,指向函数的原型(prototype)对 ...
- javascript基于原型的语言的特点
一.基于原型的语言的特点 1 只有对象,没有类;对象继承对象,而不是类继承类. 2 “原型对象”是基于原型语言的核心概念.原型对象是新对象的模板,它将自身的属性共享给新对象.一个对象不但可以享有自己 ...
- R语言基于S4的面向对象编程
前言 本文接上一篇文章 R语言基于S3的面向对象编程,本文继续介绍R语言基于S4的面向对象编程. S4对象系统具有明显的结构化特征,更适合面向对象的程序设计.Bioconductor社区,以S4对象系 ...
- javaScript构造函数、原型、面向对象编程
js最重要也是最核心的东西就是对象了,入行这么长时间,一直对面向对象一知半解.网上有很多介绍对象对象的内容,这里也做了很多借鉴, 尤其是阮一峰老师的文章.我这里写的大多例子都是阮一峰老师文章的例子,但 ...
- JavaScript基础入门12 - 面向对象编程
目录 JavaScript 面向对象编程 前言 构造函数创建对象 instanceof constructor 返回值 原型对象 关于对象的属性查找 in hasOwnProperty() JS当中实 ...
- javascript 学习笔记之面向对象编程(二):继承&多态
~~接上篇~~上一篇实现了类的实现以及类成员变量和方法的定义,下面我们来了解下面向对象中两个最重要的特性:继承和多态. 继承 js中同样可以实现类的继承这一面向对象特性,继承父类中的所有成员(变量和属 ...
- javascript 学习笔记之面向对象编程(一):类的实现
~~想是一回事,做是一回事,写出来又是一回事~~一直以来,从事C++更多的是VC++多一些,从面向过程到面向对象的转变,让我对OO的编程思想有些偏爱,将一个客观存在的规律抽象出来总是让人比较兴奋,通过 ...
- 简单介绍Javascript匿名函数和面向对象编程
忙里偷闲,简单介绍一下Javascript中匿名函数和闭包函数以及面向对象编程.首先简单介绍一下Javascript中的密名函数. 在Javascript中函数有以下3中定义方式: 1.最常用的定义方 ...
随机推荐
- <转>统计源代码行数的一些实现方法
这个问题的思考其实对于某一种语言而言,基本都能实现,只是简单和复杂而已.而此次我讨论就是只是在linux下面使用了shell和c对源代码进行行 数的讨论.本打算是实现一个python版本的,由于pyt ...
- TF基础5
卷积神经网络CNN 卷积神经网络的权值共享的网络结构显著降低了模型的复杂度,减少了权值的数量. 神经网络的基本组成包括输入层.隐藏层和输出层. 卷积神经网络的特点在于隐藏层分为卷积层和池化层. pad ...
- 脚本_部署LNMP平台
#!bin/bash#功能:部署LNMP平台,实际运行脚本时,需要去除备注.#作者:liusingbonfunction menu { //定义函数menu ...
- Python中的多个装饰器装饰一个函数
def wrapper1(func1): def inner1(): print('w1 ,before') func1() print('w1 after') return inner1 def w ...
- 企业级任务调度框架Quartz(2)-下载和安装Quartz
1.下载和安装 Quartz 根据资料上提供的网址http://www.opensymphony.com/quartz 我们可以下载到Quartz的最新版本1.6.4: 2.下载后包的说明 ...
- 在fedora「27」下,安装mysql 问题总结
有时会出现,没有mysql.sock,不存在的问题, Can't connect to local MySQL server through socket '/var/lib/mysql/mysql. ...
- 网络教程(10)回顾ARP和ping数据包
Ping 192.168.20.2 ICMP Echo (Internet Control Message Protocol ICMP Echo request ICMP Echo reply 收到I ...
- linux ubuntu安装好后,开通远程登录
1.设置root密码 ubuntu安装好后,用初始的第一个用户登录,然后修改root密码: sudo passwd root 2.检查sshd服务是否启动 (1)查看sshd状态 -----若没有ss ...
- 一个简单的 PC端与移动端的适配(通过UA)
只需在header引用个js文件, 原理就是判断UA里面的标识. 加下面代码添加到js文件,在头文件引用即可 var Pc_url = 'http://www.baidu.com'; //PC端网址 ...
- Linux用户管理案例(第二版)
批量添加用户 1.按照/etc/passwd文件格式编写用户信息文件users.info xiaofang01::1001:503::/home/xiaofang01:/bin/bash #注意不能 ...