JavaScript基于原型的面向对象系统
Posted A_山水子农
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript基于原型的面向对象系统相关的知识,希望对你有一定的参考价值。
我们知道在javascript中一切(引用类型)都是对象,对象是属性的集合,但是JavaScript中的对象到底是怎么创建的呢?在Java中是通过实例化类来创建一个对象,对象总是从类中的创建而来;在JavaScript中没有类(ES6中的class只是一个语法糖)的概念,那么JavaScript中的对象呢?JavaScript是基于原型的面向对象语言,在原型编程思想中,类并不是必需的,对象未必需要从类中创建而来,一个对象是通过克隆另外一个对象所得到的。重要的事情说三遍:对象是通过克隆另外一个对象所得到的,对象是通过克隆另外一个对象所得到的,对象是通过克隆另外一个对象所得到的。
JavaScript原型模式是用于创建对象的一种模式,先找到一个对象,然后通过克隆来创建一个一模一样的对象。ECMAScript5提供了Object.create()方法,可以用来克隆对象。
let Person = function ()
this.name = 'shanshui'
this.age = '18'
let person = new Person()
person.name = 'zinong'
person.age = '20'
let clonePerson = Object.create(person)
console.log(clonePerson.name) // 'zinong'
console.log(clonePerson.age) // '20'
clonePerson是通过克隆person 对象而来。但是person对象又是怎么创建的呢?在JavaScript语言中,我们并不需要关系克隆的细节,因为这是引擎内部负责实现的,我们所需要做的只是显示地调用let obj1 = new Object()或者let obj2 = 。此时,引擎内部会从Object.prototype上面克隆一个对象出来,我们最终得到的就是这个对象。
let person = new Person()使用new运算符从Person构造函数中创建一个person 对象,用new运算符来创建对象的过程中,实际上也只是先克隆Object.prototype对象,再进行一些其他额外操作的过程。下面看看let person = new Person()的时候new做了什么。
var obj = new Object()
obj.__proto__ = Person.prototype
Person.call(obj)
new做法是新建一个Object对象obj ,并且让obj 的__proto__
指向了Person.prototype对象,并且使用call 进行强转作用环境,从而实现了实例的创建。
Object.create的实现代码如下,Object.create内部定义了一个F构造函数,并且让F.prototype对象赋值为引进的对象/函数proto,并return出一个新的对象。Object.create克隆返回的对象也是使用new运算符创建的。
if (typeof Object.create !== "function")
Object.create = function (proto, propertiesObject)
if (typeof proto !== 'object' && typeof proto !== 'function')
throw new TypeError('Object prototype may only be an Object: ' + proto);
else if (proto === null)
throw new Error("This browser's implementation of Object.create is a shim and doesn't support 'null' as the first argument.");
if (typeof propertiesObject != 'undefined') throw new Error("This browser's implementation of Object.create is a shim and doesn't support a second argument.");
function F()
F.prototype = proto;
return new F();
;
以上是关于JavaScript基于原型的面向对象系统的主要内容,如果未能解决你的问题,请参考以下文章