文章目录

  • JavaScript 与面向对象
  • JavaScript 函数
    • JavaScript 构造函数与对象
  • 函数与对象,prototype属性与__proto__属性
  • 函数的prototype作用-动态添加属性和方法

JavaScript 与面向对象

JavaScript是直译式脚本语言、弱类型,基于原型的语言。

在JavaScript中虽然没有类的概念,但却是面向对象的开发语言。既然是面向对象,JavaScript是如何做到面向对象的继承的呢?答案就是prototype。

JavaScript使用最多的就是函数,但JavaScript的函数和一般面向过程编程语言(比如C)和面向对象的开发语言( 比如Java不同),其使用函数创建对象,函数本身也是对象。

JavaScript 函数

函数一般用来定义一段逻辑代码,以下是比较习惯的定义与调用方式

function myFunc(){alert("Hello");
}
myFunc();

但是在JavaScript中,也可以这样定义:

var myFunc = function(){alert("Hello");
};
myFunc();

JavaScript 构造函数与对象

以上用法,看不出对象的概念。但是,如果是如下定义的话,

function MyClass(name){this.name = name;
}
var myClassInstance = new MyClass("Oscar");

这样看起来就与类和实例的概念很类似了,MyClass前面的function相当于类定义的关键字。对以上代码说明如下:

  1. this对象指向生成的对象实例
  2. 使用new操作符,初始化对象实例。

在Chrome的调试模式下的效果如下:


这个对象除了自定义的name属性之外,还有一个__proto__的属性。这个属性很关键,JavaScript就是使用它实现面向对象的继承等特性。
注意:
此处基于Chrome浏览器,__proto__前后都是两个下划线。ES标准定义的属性是[[Prototype]]。

函数与对象,prototype属性与__proto__属性

在JavaScript中,函数也是对象,所以也拥有__proto__属性,除此函数还包含了prototype属性(原型属性)。以上面的MyClass函数为例,数据结构如下:

函数是一种对象,对象由函数创建,两者看起来是蛋和鸡的关系。
prototype和__proto__的关系是: 函数的prototype属性值与该函数创建的对象的__proto__属性值是相同的,以上面定义的类为例:
myClassInstance.proto===MyClass.prototype

函数的prototype作用-动态添加属性和方法

JavaScript与Java语言有一个较大差异: 对象的属性不强制要求在类(构造函数)中定义,而是可以在对象实例中添加,以上面的MyClass构造函数为例:
var myClassInstance = new MyClass(“Oscar”);
增加一个年龄的的属性age和值,只需要如下代码即可:
myClassInstance.age = 18;

这样的好处是灵活,不需要修改构造函数,但是如果要增加一个有默认值的属性,比如国家(country),默认值都是China,如果有很多MyClass的实例,就需要每个实例对象单独修改,通过prototype属性就可以实现该效果了。代码如下:
MyClass.prototype.country = “China”;

当然,这里也可以修改构造函数实现,类似:
function MyClass(name){
this.name = name;
this.country = “China”;
}
但是如果使用的是第三方库,而且有的第三方库对类进行了多层级封装,有的甚至进行了压缩,就无法修改构造函数了。

原型(prototype)属性的作用相当于父类。

JS面向对象系列之一[prototype,原型]相关推荐

  1. js面向对象编程基础

    js面向对象 文章目录 js面向对象 对象的引用 原型和原型链 系统对象与包装对象 面向对象相关语法 对象的引用 类型比较方式      对象比较时,值跟引用地址都相同时才相等. 类型赋值方式     ...

  2. 【何不三连】JS面向对象最后一弹-多态篇(羽化升仙)

    前言 你盼世界,我盼望你无bug.Hello 大家好!我是霖呆呆! 首先抱歉让大家久等了,大家一直期待的"多态"篇到现在才来 ????,其实我最近挺忙的,给张手机截图让大家感受一下 ...

  3. 简单粗暴地理解js原型链–js面向对象编程

    简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...

  4. JS 面向对象编程、原型链、原型继承(个人学习总结)

    一.面向对象 1. 面向对象 是所有语言 都有的一种编程思想,组织代码的一种形式 基于对象的语言:JS语言 面向对象的语言:c++ java c# 2. 面向对象 3大特征 封装:将重用代码封装到函数 ...

  5. JS面向过程+面向对象编程区别,原型的应用

    1.1面向过程编程 思路:面向过程就是分析出解决问题所需要的步骤,再用函数把这些步骤一步一步实现,使用的时候一个一个的依次调用即可. 1.2面向对象过程 思路:把事务分解成一个一个对象,然后由对象之间 ...

  6. JS中__proto__和prototype都是什么?原型链继承解读

    首先要知道,prototype是函数才有的属性,__proto__是每个对象都有的属性 随后,先谈一下 1.什么是prototype? prototype对象是JS实现面向对象的一个重要机制. 在很早 ...

  7. JavaScript 面向对象 (prototype 原型模式)

    一. JavaScript 设计思想 1994年,网景公司(Netscape)发布了Navigator浏览器0.9版.这是历史上第一个比较成熟的网络浏览器,轰动一时.但是,这个版本的浏览器只能用来浏览 ...

  8. JS 面向对象与原型

    创建对象 创建一个对象,然后给这个对象新建属性和方法. var box = new Object(); //创建一个 Object 对象 box.name = 'Lee'; //创建一个 name 属 ...

  9. JS基礎:Prototype Chain 原型鏈

    JS 基礎:Prototype Chain 原型鏈 文章目錄 JS 基礎:Prototype Chain 原型鏈 簡介 參考 正文 Object 對象創建 直接量 `{}` 內置構造函數 `new O ...

最新文章

  1. window.open的用法---javascript学习笔记
  2. visual studio code 调试ROS的插件
  3. vim的模式及常用命令
  4. java rmi 使用管道_使用Java RMI时要记住的两件事
  5. 吸收Mockito的流利度
  6. AUTOSAR从入门到精通100讲(九)-汽车Tbox
  7. 吴恩达机器学习 逻辑回归 作业3(手写数字分类) Python实现 代码详细解释
  8. [管理]《高绩效人士的五项管理》 -- 李践
  9. c语言判断字符串合法标识符,HDU 2024 C语言合法标识符(以及一些关于输入和ctype.h的内容)...
  10. c语言中.和-区别,c语言中-和.的区别
  11. html导出表格为csv,可将HTML表格导出为Excel|csv|txt文件的jQuery插件
  12. centos llvm安装_CentOS7.x安装LLVM6.0
  13. 有争议的conime.exe
  14. risc-v gcc 编译 atomic 指令时产生 illegal operands 错误的解决办法
  15. 【Android】虚拟环绕声
  16. OpenCV图形处理
  17. java后端秋招面经
  18. 【装机】老毛桃的安装及使用教程
  19. Android剪贴板的使用
  20. 【USB-GPIB驱动】LabVIEW通过USB-GPIB转接线程控示波器

热门文章

  1. OpenStack的组件
  2. 面向对象有哪几种常用的设计模式,六大设计原则是什么
  3. Unix系统使用的地址索引结构有什么特点?
  4. go-import下划线的作用
  5. 软件测试中有关界面测试经验总结
  6. Redis的中并发问题的解决方案小结
  7. java读取.properties文件及解决中文乱码问题
  8. (Object detection)目标检测从入门到精通——第五部分YOLO 算法
  9. 同质异质网络——(F(fraud) A(Analytics) UDPSNT(Wylie_2015))
  10. 追踪广告效果保护用户隐私 —— 隐私集合交集算法可以得兼