javascript: 基于原型的面向对象编程_weixin_34391854的博客-程序员宅基地

技术标签: java  javascript  c/c++  

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
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34391854/article/details/85964991

智能推荐

机器人参加高考还拿高分,究竟怎么做到的?_weixin_33887443的博客-程序员宅基地

最近频繁看到机器人参加高考的消息,学校教育培养的人才还不如一个机器的报道甚嚣,且尘上矣。笔者不才,从事十几年教学和教育技术研究,对机器人参加高考的宣传报道怎么兴趣荡然无存呢。近期的一则报道说高考机器人数学成绩以93分收场,我们研究高考数学试卷可以知道基础分数为90分,也就是我们所说的”比着葫芦画瓢”也可以拿到90分,老师辅导高三学生备考的时候,经常给...

python3中socket传输问题的解决_亿佰的博客-程序员宅基地_python socket 发送失败

问题背景在开始学习socket网络连接时,教材上使用的是python2,但部分代码在python3中并不适用,为此在进行python3实验时出了一些错误,下面我将描述这些错误和错误的解决过程。问题代码服务端:import sockets1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s1.bind(("127.0.0.1", 2345))s1.listen(5)while 1: conn,address = s1.acc

Linux如何打包数据,Linux文件系统之压缩数据&归档数据(打包)_Debra Resnicoff的博客-程序员宅基地

目录①Linux文件压缩工具(1)gzip(2)bzip2(3)zip②tar:打包命令 —— 可以对目录打包压缩成一个文件①Linux文件压缩工具工具文件拓展名gzip.gzbzip2.bz2zip.zip(1)gzip>>>使用file命令查看gzip压缩的文件:gzip compressed data, was "file", from Unix, last modifie...

POJ-1928-The Peanuts_z309241990的专栏-程序员宅基地

最开始以为是DP,结果贪心就好~囧~代码:#include#include#include#includeusing namespace std;const int maxn=51;struct node{ int x; int y; int val; bool operator <(const node& a)const { r

华为交换机默认vlan都是通的吗_什么是vlan?华为交换机常用的三种vlan划分方法..._the 6ix的博客-程序员宅基地

原标题:什么是vlan?华为交换机常用的三种vlan划分方法前面我们发布了华为交换机的基本配置,这篇内容是华为交换机的基本配置,今天我们来看下具体应用,以华为交换机为例,也是用的比较多,来看下它的具体配置,这个在实际项目中经常会遇到,实用性比较强,如果你以对vlan了解不多,那么这篇文章可以带你深入学习vlan,都有详细注释。端口类型在学习划分vlan前,必须要了解华为交换机的端口类型,以及他们的...

Android设置Settings:ListPreference【3】_Zhang Phil-程序员宅基地

Android设置Settings:ListPreference【3】Android的Settings实现中,ListPreference使用稍微复杂些,ListPreference使用两个数据源:entries和entryValues,entries和entryValues存在对应关系,可以这么简单理解,entries是人类可读的有意义的内容,而entryValues则是用来为机器或

随便推点

Android 怎么设置 Setting 中的默认选项_u013952558的专栏-程序员宅基地

如果想修改系统启动后加载的默认值修改SettingsProvider默认值,Settings能够配置Android系统的各种设置,这些设置的默认值都是由frameworks中的SettingsProvider从数据库中读取的,那么第一次开机的时候这些数据都是从哪儿来的呢?frameworks/base/packages/SettingsProvider/res/values/default

java对数据库的增删改查_在java中对数据库进行增删改查_Lucky 龙的博客-程序员宅基地

代码区域:package com.oracle.jdbc.demo1;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;public class JDBCDemo {//四个属性(四个常量的字符串)/*jdbcNameurluserpassword*/private stati...

android设置 默认wifi_dp__mcu的专栏-程序员宅基地

android设置 默认wifi默认wifi打开\\a33-dvk3\frameworks\base\packages\SettingsProvider\res\values\defaults.xmltruetrue自动连接设定的热点\\a33-dvk3\out\target\product\astar-dvk3\sy

JS学习笔记---02 JS注释_xiaoyu~~的博客-程序员宅基地

03、JS注释单行注释 ctrl + /多行注释 默认的快捷键 shift + alt + a多行注释 vscode 左下角设置中 修改多行注释快捷键:ctrl + shift + /

如何让bat,cmd文件后台运行?如何把文件打包成EXE?_weixin_30672295的博客-程序员宅基地

方法1:在“运行”中输入IEXPRESS 这是WINDOWS自带的打包程序,好像也可以生成安装包。 下一步-下一步-随便填个名字(下一步)-下一步-下一步-ADD(选好你的BAT文件 继续下一步)-Install里面选你刚加进去的文件(下一步)-hidden(下一步)-下一步-保存打包好的文件(勾一下hidden下一步)-下一步-don‘t save下一步-下一步-完成以后运行打好包...

Python随机数的写法_小太阳️的博客-程序员宅基地_python的随机数怎么写

# 随机数import random# 从序列的元素中随机挑选一个元素print(random.choice([1, 2, 3, 4, 5]))print(random.choice(range(5))) # range(5) == [0, 1, 2, 3, 4]print(random.randrange(2)) # randrange(2) == [0, 1]print(ra...