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: 基于原型的面向对象编程的更多相关文章

  1. JavaScript - 基于原型的面向对象

    JavaScript - 基于原型的面向对象 1. 引言 JavaScript 是一种基于原型的面向对象语言,而不是基于类的!!! 基于类的面向对象语言,比如 Java,是构建在两个不同实体的概念之上 ...

  2. javascript基于原型实现面向对象

    传统的OO语言有类的概念,但js(ES5)却是基于原型实现的面向对象. 原型是?我们创建的每一个函数都会有一个原型(prototype)属性,这个属性是一个指针,指向函数的原型(prototype)对 ...

  3. javascript基于原型的语言的特点

    一.基于原型的语言的特点 1 只有对象,没有类;对象继承对象,而不是类继承类. 2  “原型对象”是基于原型语言的核心概念.原型对象是新对象的模板,它将自身的属性共享给新对象.一个对象不但可以享有自己 ...

  4. R语言基于S4的面向对象编程

    前言 本文接上一篇文章 R语言基于S3的面向对象编程,本文继续介绍R语言基于S4的面向对象编程. S4对象系统具有明显的结构化特征,更适合面向对象的程序设计.Bioconductor社区,以S4对象系 ...

  5. javaScript构造函数、原型、面向对象编程

    js最重要也是最核心的东西就是对象了,入行这么长时间,一直对面向对象一知半解.网上有很多介绍对象对象的内容,这里也做了很多借鉴, 尤其是阮一峰老师的文章.我这里写的大多例子都是阮一峰老师文章的例子,但 ...

  6. JavaScript基础入门12 - 面向对象编程

    目录 JavaScript 面向对象编程 前言 构造函数创建对象 instanceof constructor 返回值 原型对象 关于对象的属性查找 in hasOwnProperty() JS当中实 ...

  7. javascript 学习笔记之面向对象编程(二):继承&多态

    ~~接上篇~~上一篇实现了类的实现以及类成员变量和方法的定义,下面我们来了解下面向对象中两个最重要的特性:继承和多态. 继承 js中同样可以实现类的继承这一面向对象特性,继承父类中的所有成员(变量和属 ...

  8. javascript 学习笔记之面向对象编程(一):类的实现

    ~~想是一回事,做是一回事,写出来又是一回事~~一直以来,从事C++更多的是VC++多一些,从面向过程到面向对象的转变,让我对OO的编程思想有些偏爱,将一个客观存在的规律抽象出来总是让人比较兴奋,通过 ...

  9. 简单介绍Javascript匿名函数和面向对象编程

    忙里偷闲,简单介绍一下Javascript中匿名函数和闭包函数以及面向对象编程.首先简单介绍一下Javascript中的密名函数. 在Javascript中函数有以下3中定义方式: 1.最常用的定义方 ...

随机推荐

  1. 路飞学城Python-Day108

    96-分页器1 批量插入的方式就不能用ORM的create()方式去做了,因为create就是对sql进行insert的操作,sql最好不要每次有一条数据就去进行插入,最好的方式就是插入一组数据 fr ...

  2. Alios-Things的学习与使用(1)

    目录 Alios-Things的学习与使用 1.简介 1.1 为什么要学alios-Things 2. 环境搭建 2.1 使用docker toolbox安装docker 2.2 测试使用dockde ...

  3. python爬网页中文乱码问题

    再用python爬取网页时,用模拟浏览器登陆,得到的中文字符出现乱码,该怎么解决呢? url = “http://newhouse.hfhouse.com/” req = urllib2.Reques ...

  4. deepin 新创建的用户文件管理中挂载点打不开

    使用 root 用户可以打开,但是使用非 root 用户打不开 原因是权限不够 test1@test1-PC:~$ cd /media/ test1@test1-PC:/media$ ls apt c ...

  5. input标签处理多文件上传

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  6. windows远程桌面无法复制粘贴的解决方案

    方法一:在网上最常见的方法,就是杀掉 rdpclip.exe进程后重启. 在远程桌面的任务栏,右键启动任务管理器 这时候进程列表中已经没有看到rdpclip.exe了,桌面左下方点击[开始]--> ...

  7. js:Array对象常用方法介绍

    前言 在js中,数组作为一个特殊的对象.是我们常用的数据格式.今天就来梳理一下常用的数组方法. 1.基础 几种基础的就简单介绍一下:创建数组 var arr1 = new Array(); //括号可 ...

  8. 小松之LINUX驱动学习笔记之模块间函数调用通讯

    1. 符号导出函数 EXPORT_SYMBOL() EXPORT_SYMBOL标签内定义的函数对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用. EXPORT_SYMBOL_GPL( ...

  9. Problem 10

    Problem 10 # Problem_10.py """ The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. ...

  10. FreeMarker 整合 springmvc

    一.添加 jar 包 <dependency> <groupId>org.freemarker</groupId> <artifactId>freema ...