手写:javascript中的关键字new
简单介绍一下new
new再熟悉不过了,new后面跟着构造函数,可以创建对象,这个对象的原型指向构造函数的原型对象,说起来可能有点绕,直接看代码吧
function Person(name, age){
this.name = name;
this.age = age;
}
let person1 = new Person("张三", 22);
console.log(person1.__proto__ === Person.prototype); // true
console.log(person1 instanceof Person); // true
而new后面的构造函数,也可以这样调用
let person2 = new Person;
其实这样写就等同于,不传任何参数调用构造函数
let person2 = new Person();
打印person2可以看到
Person { name: undefined, age: undefined }
一般情况下,构造函数是不定义返回值的,那我们试一试,如果构造函数定义返回值,会怎么样,首先,返回一个字符串
function Person(name, age){
this.name = name;
this.age = age;
return "person"
}
let person1 = new Person("张三", 22);
let person2 = new Person;
console.log(person1); // Person { name: '张三', age: 22 }
console.log(person2); // Person { name: undefined, age: undefined }
console.log(person1.__proto__ === Person.prototype); // true
console.log(person1 instanceof Person) // true
看来构造函数返回字符串没有影响,那返回一个对象呢
function Person(name, age){
this.name = name;
this.age = age;
return {
id : "person"
}
}
let person1 = new Person("张三", 22);
let person2 = new Person;
console.log(person1); // { id: 'person' }
console.log(person2); // { id: 'person' }
console.log(person1.__proto__ === Person.prototype); // false
console.log(person1 instanceof Person) // false
可以看到,如果返回一个对象,那么通过new关键字创建的对象则为构造返回的值,且也不继承于构造的原型对象
手写
了解的差不多了,开始手写
首先定义一个函数名为myNew,参数接收一个function,也就是构造函数,
function myNew(Constructor){
if(typeof Constructor !== "function"){
throw "参数Constructor必须是方法(function)"
}
}
ok,紧接着需要创建一个新的对象,并且这个对象的原型指向的是构造函数的原型对象
所以
function myNew(Constructor){
if(typeof Constructor !== "function"){
throw "参数Constructor必须是方法(function)"
}
let obj = {};
obj.__proto__ = Constructor.prototype;
}
接着,因为执行构造函数的是,需要传参数,并且在构造函数内部会为this赋值,所以我们需要执行构造函数,并且把构造函数内的上下文指向到obj
function myNew(Constructor){
if(typeof Constructor !== "function"){
throw "参数Constructor必须是方法(function)"
}
let obj = {};
obj.__proto__ = Constructor.prototype;
// 获取参数
let params = Array.from(arguments);
// 把参数第一位,也就是构造函数移除
params.shift();
// 执行构造函数,并且吧上下文只设置为obj
Constructor.apply(obj, params);
return obj
}
但是我们需要前面提到了,有时候构造函数是可能有返回值的,所以最终代码为
最终源码
function myNew(Constructor){
if(typeof Constructor !== "function"){
throw "参数Constructor必须是方法(function)"
}
let obj = {};
obj.__proto__ = Constructor.prototype;
// 获取参数
let params = Array.from(arguments);
// 把参数第一位,也就是构造函数移除
params.shift();
// 执行构造函数,并且吧上下文只设置为obj
let result = Constructor.apply(obj, params);
// 判断构造函数执行返回是不是object,是的话返回这个对象
return typeof result === "object" ? result : obj
}
我们以之前的例子来验证一下
function Person(name, age){
this.name = name;
this.age = age;
return "person"
}
let person1 = myNew(Person, "张三", 22);
let person2 = myNew(Person);
console.log(person1); // Person { name: '张三', age: 22 }
console.log(person2); // Person { name: undefined, age: undefined }
console.log(person1.__proto__ === Person.prototype); // true
console.log(person1 instanceof Person) // true
构造有返回值的时候
function Person(name, age){
this.name = name;
this.age = age;
return {
id : "person"
}
}
let person1 = myNew(Person, "张三", 22);
let person2 = myNew(Person);
console.log(person1); // { id: 'person' }
console.log(person2); // { id: 'person' }
console.log(person1.__proto__ === Person.prototype); // false
console.log(person1 instanceof Person) // false
与前面完全一致
手写:javascript中的关键字new的更多相关文章
- 深入解析Javascript中this关键字的使用
深入解析Javascript中面向对象编程中的this关键字 在Javascript中this关键字代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如: function TestFun ...
- JavaScript中this关键字的使用比较
JavaScript中this关键字的使用比较 this关键字在JavaScript中,用的不能说比较多,而是非常多.那么熟悉this关键字的各种用法则显得非常关键. this有时候就是我们经常说的上 ...
- 大前端学习笔记整理【五】关于JavaScript中的关键字——this
写在前面 工作有那么一段时间了,但是在工作中,发现自己的理论知识还是有所欠缺.特别是在javascript上,很多东西其实自己属于知道要用这个,但是不知道为什么要这么用...这种情况很是尴尬了,所以写 ...
- javascript中this关键字详解
不管学习什么知识,习惯于把自己所学习的知识列成一个list,会有助于我们理清思路,是一个很好的学习方法.强烈推荐. 以下篇幅有点长,希望读者耐心阅读. 以下内容会分为如下部分: 1.涵义 1.1:th ...
- JavaScript中var关键字的使用详解
作用 声明作用:如声明个变量. 语法 ? 1 var c = 1; 省略var 在javascript中,若省略var关键字而直接赋值,那么这个变量为全局变量,哪怕是在function里定义的. ? ...
- [No000069]Javascript中this关键字详解
Quiz 请看下面的代码,最后alert出来的是什么呢?(chrome下按F12,选择Console直接复制粘贴运行) var name = "Bob"; var nameObj ...
- javascript中的关键字和保留字
javascript中关键字的问题,将名称替换了下,确实就没有问题了.现在将它的关键字和保留字贴出来,便于日后查看和避免在次出现类似的问题. 1 关键字breakcasecatchcontinuede ...
- TensorFlow实现Softmax Regression识别手写数字中"TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败”问题
出现问题: 在使用TensorFlow实现MNIST手写数字识别时,出现"TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应 ...
- javascript中new关键字详解
和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,万物皆对象,为什么还要通过 ...
随机推荐
- Linux环境下安装JDK8
Linux环境下搭建Java项目运行环境,首先要安装JDK,安装JDK8的步骤如下: 1 下载JDK安装包 下载地址:http://www.oracle.com/technetwork/java/ja ...
- 深入理解k8s中的访问控制(认证、鉴权、审计)流程
Kubernetes自身并没有用户管理能力,无法像操作Pod一样,通过API的方式创建/删除一个用户实例,也无法在etcd中找到用户对应的存储对象. 在Kubernetes的访问控制流程中,用户模型是 ...
- 给Django的Admin添加自定义Action 并移除需要选择对象的限制
不得不说,Django的Admin真的给开发带来很多便利,这不,我又来折腾了,这次是添加自定义的action 这个自定义的Action可以看看官方文档的介绍,很详细,不再赘述. https://doc ...
- 基于伪分布式Hadoop搭建Hive平台详细教程
一.搭建环境的前提条件 环境:Linux系统 Hadoop-2.6.0 MySQL 5.6 apache-hive-2.3.7 这里的环境不一定需要和我一样,基本版本差不多都ok的,所需安装包和压缩包 ...
- idea使用技巧一常用快捷键
快捷键 功能 ctrl+x 删除行 ctrl+d 复制行 ctrl+n 查找类 ctrl+f 查找文本 ctrl+j 自动代码 ctrl+h 显示类结构图 ctrl+q 显示注释文档 ctrl+p 方 ...
- 如何通过seo技术提高网站对用户的友好度
http://www.wocaoseo.com/thread-129-1-1.html 今天的天气又是29度,眼看着满大街的人都穿着短袖和衬衣了,自己也再不能穿个厚厚的外套出去了,要不会被别人笑 ...
- 模型层中QuerySet的学习
创建对象 使用关键字参数实例化模型实例来创建一个对象,然后调用save()把它保存到数据库中 pub_obj = models.Publisher(title='奥利给出版社') pub_obj.sa ...
- vue项目配置vuex
在vue项目中各组件之间传值非常的好用,但是当组件数量多的时候,就会感觉到多个组件之间传值就会变的非常痛苦.因此就需要使用vuex来管理数据值,这样在任何页面不需要传值过来的情况下就可以拿到我们想要的 ...
- linux系统指法练习与打字游戏软件
以 fedora和ubuntu 系统为例,fedora/centos系统用yum install命令安装 ubuntu系统用apt-get instll命令安装 yum install ktouch$ ...
- Python 爬虫+tkinter界面 实现历史天气查询
文章目录 一.实现效果 1. python代码 2. 运行效果 二.基本思路 1. 爬虫部分 2. tkinter界面 一.实现效果 很多人学习python,不知道从何学起.很多人学习python,掌 ...