资讯专栏INFORMATION COLUMN

JS实现一个new

tianyu / 2667人阅读

摘要:实现一个代码如下小白实现小黑解析思路创建一个新对象把的指向实现继承执行构造函数传递参数改变指向返回解析的第一个参数是返回的是的实参因此为获取剩下的参数新建对象把新建对象的指向的原型链上传递参数改变指向执行结果运算符用于测试构造函数的属性是否

实现一个new
代码如下:

var Dog = function(name) {
  this.name = name;
}
Dog.prototype.bark = function() {
  console.log("wang");
}
Dog.prototype.sayName = function() {
  console.log("my name is", this.name);
}

var xiaobai = new Dog("小白");
xiaobai.sayName();
xiaobai.bark();

//实现new
var _new = function() {
  var constructor = Array.prototype.shift.call(arguments);  //Dog
  var args = arguments;
  const obj = new Object();
  obj.__proto__ = constructor.prototype;
  constructor.call(obj, ...args);
  return obj;
}

var xiaohei = _new(Dog, "小黑");
xiaohei.bark();
xiaohei.sayName();

console.log(xiaohei instanceof Dog);    //true

解析

思路:

创建一个新对象obj

把obj的__proto__指向Dog.prototype实现继承

执行构造函数,传递参数,改变this指向,Dog.call(obj, ...args)

返回obj

解析:

var constructor = Array.prototype.shift.call(arguments); //Dog
_new()的第一个参数是Dog,arguments返回的是_new的实参,因此constructor为Dog

var args = arguments; 获取剩下的参数

const obj = new Object(); 新建对象

obj.__proto__ = constructor.prototype; 把新建对象的__proto__指向Dog的原型链上

constructor.call(obj, ...args);传递参数,改变this指向

执行结果

console.log(Dog.prototype);

console.log(xiaobai);

console.log(xiaohei);

console.log(xiaohei instanceof Dog); true

instanceof运算符用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/105610.html

相关文章

  • 异步发展流程 —— 手写一个符合 Promise/A+ 规范的 Promise

    摘要:构造函数的实现我们在使用的时候其实是使用关键字创建了一个的实例,其实是一个类,即构造函数,下面来实现构造函数。 showImg(https://segmentfault.com/img/remote/1460000018998456); 阅读原文 概述 Promise 是 js 异步编程的一种解决方案,避免了 回调地狱 给编程带来的麻烦,在 ES6 中成为了标准,这篇文章重点不是叙...

    UnixAgain 评论0 收藏0
  • 从0到1实现Promise

    摘要:通过或者拿到方法回调函数的返回值,然后调用,将新增的的和传入到中。打印结果实现方法接收一个包含多个的数组,当有一个为状态时,整个大的为,并执行回调函数。 前言 Promise大家一定都不陌生了,JavaScript异步流程从最初的Callback,到Promise,到Generator,再到目前使用最多的Async/Await(如果对于这些不熟悉的可以参考我另一篇文章《JavaScri...

    EddieChan 评论0 收藏0
  • JS中的面向对象编程

    摘要:一面向对象编程面向对象编程是一种抽象方式创建模型的编程方式。继承我们实现一个子类,继承汽车类将类的属性和方法赋值给继承汽车类的原型链创建子类实例以上是中的面向对象编程的简单介绍,如有错误,欢迎指出。 一.面向对象编程面向对象编程(OOP--Object Oriented Programming)是一种抽象方式创建模型的编程方式。继承,封装,多态是OOP的三大基本特征。许多主流编程语言都...

    lunaticf 评论0 收藏0
  • DIP、IoC、DI、JS

    摘要:维基百科该原则规定高层次的模块不应该依赖与低层次的模块,两者都应该依赖于抽象接口。依赖反转原则则颠倒这种依赖关系,并以上面提到的两个规定作为指导思想。维基百科这些话的意思就是将依赖对象的创建和绑定转移到被依赖对象类的外部来实现。 在这个标题中,除了 JS 是乱入之外,其它的几个词汇都是存在一个共同点的,那就是依赖。 那么,依赖是什么呢? 比如,现在我正在写这篇博客文,但是我得在电脑上编...

    ssshooter 评论0 收藏0
  • js设计模式(一)-单例模式

    摘要:虽然是弱类型的语言,但是也有构造函数和实例。也就是说,我们只在第一次调用构造函数时创建新对象,之后调用返回时返回该对象即可。而我不认为这是一个单例模式的原因如下我觉得既然两次调用同一个构造函数,返回的不是同一个对象,那不就不能成为单例模式。 写在前面 (度过一阵的繁忙期,又可以愉快的开始学习新知识了,一年来技术栈切来切去,却总觉得js都还没学完-_-) 本文主要围绕js的设计模式进行展...

    AlexTuan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<