摘要:主要过程如下创建一个空对象将该空对象的原型设置为构造函数的原型,即以该对象为上下文执行构造函数,即返回该对象,即。
new
new func()主要过程如下:
创建一个空对象obj;
将该空对象的原型设置为构造函数的原型,即obj.__proto__ = func.prototype;
以该对象为上下文执行构造函数,即func.call(obj);
返回该对象,即return obj。
对于第3、4步还有个小细节,如果第3步func有返回值且返回值为对象,则第4步会返回func的返回值,反之则默认返回obj。
模仿new原理的代码如下:
function new2(func) { // func为某个构造函数 var createObject = Object.create(func.prototype); // 以构造函数的原型对象为原型,创建一个空对象,即创建一个{ __proto__: func.prototype } var returnObject = func.call(createObject); // 使用刚创建的空对象作为上下文(this)执行构造函数 if (typeof returnObject === "object") { // 若构造函数有返回对象,则返回该对象 return returnObject; } else { // 若构造函数未返回对象,则返回Object.create创建的对象 return createObject; } };Object.create()
在模仿new原理的代码中用到了Object.create(),它的作用是以入参为原型创建一个空对象,即
Object.create = function (obj) { return { "__proto__": obj}; };
或
Object.create = function (obj) { function F() {} F.prototype = obj; return new F(); };
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/97986.html
摘要:除了以上介绍的几种对象创建方式,此外还有寄生构造函数模式稳妥构造函数模式。 showImg(https://segmentfault.com/img/remote/1460000018196128); 面向对象 是以 对象 为中心的编程思想,它的思维方式是构造。 面向对象 编程的三大特点:封装、继承、多态: 封装:属性方法的抽象 继承:一个类继承(复制)另一个类的属性/方法 多态:方...
摘要:目录无继承简单的字段声明无继承简单的方法声明简单继承一层继承字段覆盖无继承静态函数无继承静态变量神秘的类无继承简单的字段声明先来看个最简单的例子,我们仅仅使用了关键字并定义了一个变量最后编译出来的代码如下。无继承静态变量还有个小例子。 在[上一篇文章][]中,我们提到 ES6 的 class 语法糖是个近乎完美的方案,并且讲解了实现继承的许多内部机制,如 prototype/__pro...
摘要:常用继承方式主要分为种原型链继承构造函数继承组合继承原型式继承寄生式继承寄生组合继承以及继承多个对象。所以说,构造函数基础只能继承父类的实例属性和方法,不能继承原型链上的属性和方法。 JavaScript常用继承方式主要分为(7种):原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合继承以及继承多个对象。 1:原型链继承(核心:将父类的实例作为子类的原型) 基本概念:...
摘要:使用构造函数的原型继承相比使用原型的原型继承更加复杂,我们先看看使用原型的原型继承上面的代码很容易理解。相反的,使用构造函数的原型继承像下面这样当然,构造函数的方式更简单。 五天之前我写了一个关于ES6标准中Class的文章。在里面我介绍了如何用现有的Javascript来模拟类并且介绍了ES6中类的用法,其实它只是一个语法糖。感谢Om Shakar以及Javascript Room中...
阅读 1656·2021-11-23 09:51
阅读 2678·2021-11-22 09:34
阅读 1319·2021-10-14 09:43
阅读 3664·2021-09-08 09:36
阅读 3208·2019-08-30 12:57
阅读 2027·2019-08-30 12:44
阅读 2518·2019-08-29 17:15
阅读 3017·2019-08-29 16:08