JavaScript基于原型的面向对象系统

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27626333/article/details/79632400

  我们知道在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();
    };
}

猜你喜欢

转载自blog.csdn.net/qq_27626333/article/details/79632400