通过例子深入理解javascript中的new操作符
1.首先看一道题目
function Cat(name,age){
this.name=name;
this.age=age;
}
console.log(new Cat('miaomiao',18));
//Cat {name: "miaomiao", age: 18}
2.那么这里面的this指的是什么呢
function Cat(name,age){
console.log(this);//Cat {}
this.name=name;
this.age=age;
}
new Cat('miaomiao',18);
3.我们发现this是一个名为Cat的空对象,那么后两句(this.name=name;this.age=age)就相当于var Cat={};Cat.name=name;Cat.age=age;是这样的么我们来试一下
function Cat(name,age){
var Cat = {};
Cat.name=name;
Cat.age=age;
}
console.log(new Cat('miaomiao',18));
//Cat {}
4.发现并不是那么回事,这是为什么,在javascript中如果没有return 那么函数就会默认return this为了验证我们在函数最后面return Cat即可
function Cat(name,age){
var Cat = {};
Cat.name=name;
Cat.age=age;
return Cat;
}
console.log(new Cat('miaomiao',18));
//Object {name: "miaomiao", age: 18}
5.好像成功了,我们和之前对比一下
function Cat(name,age){
this.name=name;
this.age=age;
}
console.log(new Cat('miaomiao',18));
//Cat {name: "miaomiao", age: 18}
6.函数的作用我们理解的差不多,下面开始探索NEW,试想如果我们不返回对象而是返回null或者其他类型的会是什么效果呢
function Cat(name,age){
var Cat = {};
Cat.name=name;
Cat.age=age;
return undefined//或者null 123 '123'等非对象;
}
console.log(new Cat('miaomiao',18));//Cat{}
7.其他的一律输出空对象
那么我们试着写一个类似new的函数功能
function Cat(name,age){
this.name=name;
this.age=age;
}
function New(){
var obj={};
var res=Cat.apply(obj,arguments);
return typeof res==='object'?res:obj
}
console.log(New('mimi',18))
//Object {name: "mimi", age: 18}
8.这样就大功告成了么 当然不是,我们接着往下看
function Cat(name,age){
this.name=name;
this.age=age;
}
Cat.prototype.sayHi=function(){
console.log('hi')
}
function New(){
var obj={};
var res=Cat.apply(obj,arguments);
return typeof res==='object'?res:obj
} console.log(new Cat('mimi',18).sayHi())
console.log('-------------');
console.log(New('mimi',18).sayHi()); VM841:7 hi
VM841:15 undefined
VM841:16 -------------
VM841:17 Uncaught TypeError: New(...).sayHi is not a function(…)
9.红色的事报错,说明new操作不仅仅关注函数的本身 还关心他的原型 prototype
上面分析了那么多,现在进入正题。
普通对象是没有prototype属性的,只有隐藏属性__proto__(IE上也有该隐藏属性,但是使用obj.__proto__不能输出东西,所以建议不要使用__proto__属性)。而函数对象则两者兼有。prototype属性指向的是函数对象的原型对象,对象的__proto__属性是创建实例对象的时候对应的函数对象的原型对象。
function Cat(name,age){
this.name=name;
this.age=age;
}
Cat.prototype.sayHi=function(){
console.log('hi')
}
function New(){
var obj={};
obj.__proto__=Cat.prototype;
var res=Cat.apply(obj,arguments);
return typeof res==='object'?res:obj
} console.log(new Cat('mimi',18).sayHi())
console.log('-------------');console.log(New('mimi',18).sayHi()); VM844:7 hi
VM844:16 undefined
VM844:17 -------------
VM844:7 hi
VM844:17 undefined
undefined
10.ok大功告成
通过例子深入理解javascript中的new操作符的更多相关文章
- 深入理解JavaScript中创建对象模式的演变(原型)
深入理解JavaScript中创建对象模式的演变(原型) 创建对象的模式多种多样,但是各种模式又有怎样的利弊呢?有没有一种最为完美的模式呢?下面我将就以下几个方面来分析创建对象的几种模式: Objec ...
- 深入理解JavaScript中的属性和特性
深入理解JavaScript中的属性和特性 JavaScript中属性和特性是完全不同的两个概念,这里我将根据自己所学,来深入理解JavaScript中的属性和特性. 主要内容如下: 理解JavaSc ...
- 深入理解javascript中的立即执行函数(function(){…})()
投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-06-12 我要评论 这篇文章主要介绍了深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是 ...
- 理解 JavaScript 中的 this
前言 理解this是我们要深入理解 JavaScript 中必不可少的一个步骤,同时只有理解了 this,你才能更加清晰地写出与自己预期一致的 JavaScript 代码. 本文是这系列的第三篇,往期 ...
- 【拾遗】理解Javascript中的Arguments
前言 最近在看JavaScript相关的知识点,看到了老外的一本Javascript For Web Developers,遇到了一个知识盲点,觉得老外写的很明白很透彻,记录下来加深印象,下面是我摘出 ...
- 理解javascript中的回调函数(callback)【转】
在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...
- 深入理解javascript中的立即执行函数
这篇文章主要介绍了深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是用(function(){…})()包住业务代码,使用jquery时比较常见,需要的朋友可以 ...
- 深入理解JavaScript中的作用域和上下文
介绍 JavaScript中有一个被称为作用域(Scope)的特性.虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,我会尽我所能用最简单的方式来解释作用域.理解作用域将使你的代码脱颖而出,减 ...
- 理解JavaScript中的原型继承(2)
两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...
随机推荐
- 启动hadoop集群
1.配置core-site.xml(每个节点上都要配置) 路径: /usr/local/hadoop-2.7.3/etc/hadoop/core-site.xml 配置项1: name: fs.def ...
- C#基础之匿名方法实例教程
本文以实例形式讲解了C#的匿名方法的用法,分享给大家供大家参考之用.具体如下: 匿名方法是C# 2.0的语言新特性.首先看个最简单的例子: class Program { static void Ma ...
- flask实例化参数以及信号
一.实例化补充 instance_path和instance_relative_config是配合来用的.这两个参数是用来找配置文件的,当用app.config.from_pyfile('settin ...
- InnoDB存储引擎内存缓冲池管理技术——LRU List、Free List、Flush List
InnoDB是事务安全的MySQL存储引擎,野山谷OLTP应用中核心表的首选存储引擎.他是基于表的存储引擎,而不是基于数据库的.其特点是行锁设计.支持MVCC.支持外键.提供一致性非锁定读,同时被设计 ...
- vuex 入门
vuex.js 状态(数据)管理 在vue中当我们管理数据的时候比较乱,我们要用到下面的这个库,vuex.js Vuex介绍 每一个Vuex应用的核心就是store(仓库),他是用来存储数据的 &qu ...
- 【HackerRank】Pairs
题目链接:Pairs 完全就是Two Sum问题的变形!Two Sum问题是要求数组中和正好等于K的两个数,这个是求数组中两个数的差正好等于K的两个数.总结其实就是“骑驴找马”的问题:即当前遍历ar[ ...
- js怎么将光标移动特定的位置:
第一种方法: a 标签的锚: 将a标签的herf='#element_id_name' 即可 <a href="#comment_content" class=" ...
- 20145240 《Java程序设计》第六周学习总结
20145240 <Java程序设计>第六周学习总结 教材学习内容总结 InputStream与OutputStream 10.1.1串流设计的概念 Java将输入/输出抽象化为串流,数据 ...
- INSPIRED启示录 读书笔记 - 第32章 提防有特殊要求的产品
产品需求不能用户说了算 1.在看到具体的产品之前,用户很难知道自己需要什么 2.用户不知道什么样的产品是可行的(在目前的技术条件下可以实现) 3.用户之间缺少沟通,需求很难统一 怎样回避特例产品可能带 ...
- Kubernetes 部署Mysql 主从复制集群
Mysql主从参考文章: https://www.jianshu.com/p/509b65e9a4f5 http://blog.51cto.com/ylw6006/2071864 Statefulse ...