JS面向对象系列之一[prototype,原型]
文章目录
- 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相当于类定义的关键字。对以上代码说明如下:
- this对象指向生成的对象实例
- 使用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,原型]相关推荐
- js面向对象编程基础
js面向对象 文章目录 js面向对象 对象的引用 原型和原型链 系统对象与包装对象 面向对象相关语法 对象的引用 类型比较方式 对象比较时,值跟引用地址都相同时才相等. 类型赋值方式 ...
- 【何不三连】JS面向对象最后一弹-多态篇(羽化升仙)
前言 你盼世界,我盼望你无bug.Hello 大家好!我是霖呆呆! 首先抱歉让大家久等了,大家一直期待的"多态"篇到现在才来 ????,其实我最近挺忙的,给张手机截图让大家感受一下 ...
- 简单粗暴地理解js原型链–js面向对象编程
简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...
- JS 面向对象编程、原型链、原型继承(个人学习总结)
一.面向对象 1. 面向对象 是所有语言 都有的一种编程思想,组织代码的一种形式 基于对象的语言:JS语言 面向对象的语言:c++ java c# 2. 面向对象 3大特征 封装:将重用代码封装到函数 ...
- JS面向过程+面向对象编程区别,原型的应用
1.1面向过程编程 思路:面向过程就是分析出解决问题所需要的步骤,再用函数把这些步骤一步一步实现,使用的时候一个一个的依次调用即可. 1.2面向对象过程 思路:把事务分解成一个一个对象,然后由对象之间 ...
- JS中__proto__和prototype都是什么?原型链继承解读
首先要知道,prototype是函数才有的属性,__proto__是每个对象都有的属性 随后,先谈一下 1.什么是prototype? prototype对象是JS实现面向对象的一个重要机制. 在很早 ...
- JavaScript 面向对象 (prototype 原型模式)
一. JavaScript 设计思想 1994年,网景公司(Netscape)发布了Navigator浏览器0.9版.这是历史上第一个比较成熟的网络浏览器,轰动一时.但是,这个版本的浏览器只能用来浏览 ...
- JS 面向对象与原型
创建对象 创建一个对象,然后给这个对象新建属性和方法. var box = new Object(); //创建一个 Object 对象 box.name = 'Lee'; //创建一个 name 属 ...
- JS基礎:Prototype Chain 原型鏈
JS 基礎:Prototype Chain 原型鏈 文章目錄 JS 基礎:Prototype Chain 原型鏈 簡介 參考 正文 Object 對象創建 直接量 `{}` 內置構造函數 `new O ...
最新文章
- window.open的用法---javascript学习笔记
- visual studio code 调试ROS的插件
- vim的模式及常用命令
- java rmi 使用管道_使用Java RMI时要记住的两件事
- 吸收Mockito的流利度
- AUTOSAR从入门到精通100讲(九)-汽车Tbox
- 吴恩达机器学习 逻辑回归 作业3(手写数字分类) Python实现 代码详细解释
- [管理]《高绩效人士的五项管理》 -- 李践
- c语言判断字符串合法标识符,HDU 2024 C语言合法标识符(以及一些关于输入和ctype.h的内容)...
- c语言中.和-区别,c语言中-和.的区别
- html导出表格为csv,可将HTML表格导出为Excel|csv|txt文件的jQuery插件
- centos llvm安装_CentOS7.x安装LLVM6.0
- 有争议的conime.exe
- risc-v gcc 编译 atomic 指令时产生 illegal operands 错误的解决办法
- 【Android】虚拟环绕声
- OpenCV图形处理
- java后端秋招面经
- 【装机】老毛桃的安装及使用教程
- Android剪贴板的使用
- 【USB-GPIB驱动】LabVIEW通过USB-GPIB转接线程控示波器
热门文章
- OpenStack的组件
- 面向对象有哪几种常用的设计模式,六大设计原则是什么
- Unix系统使用的地址索引结构有什么特点?
- go-import下划线的作用
- 软件测试中有关界面测试经验总结
- Redis的中并发问题的解决方案小结
- java读取.properties文件及解决中文乱码问题
- (Object detection)目标检测从入门到精通——第五部分YOLO 算法
- 同质异质网络——(F(fraud) A(Analytics) UDPSNT(Wylie_2015))
- 追踪广告效果保护用户隐私 —— 隐私集合交集算法可以得兼