javascript高级知识分析——实例化
代码信息来自于http://ejohn.org/apps/learn/。
new做了什么?
- function Ninja(){
- this.name = "Ninja";
- }
- var ninjaA = Ninja();
- console.log( ninjaA, "undefined,ninja并不是实例化" );
- var ninjaB = new Ninja();
- console.log( ninjaB.name == "Ninja", "true,在实例化里存在name属性" )
对一个函数进行new操作,这就是实例化。
上述代码的流程为,创造一个临时对象,继承Ninja.prototype对象,执行函数Ninja,一开始将上下文this设置为临时对象。没有return语句,返回这个临时对象。
我们的上下文this指向实例化对象
- function Ninja(){
- this.swung = false;
- // Should return true
- this.swingSword = function(){
- this.swung = !this.swung;
- return this.swung;
- };
- }
- var ninja = new Ninja();
- console.log( ninja.swingSword(), "调用实例对象方法" );
- console.log( ninja.swung, "引用实例对象属性" );
- var ninjaB = new Ninja();
- console.log( !ninjaB.swung, "确定this引用的属性是实例化对象的属性,实例化对象彼此不影响." );
习题:增加一个方法,可以给ninja一个name属性
- function Ninja(name){
- //补足
- }
- var ninja = new Ninja("John");
- console.log( ninja.name == "John", "在初始化时name属性就被设置" );
- ninja.changeName("Bob");
- console.log( ninja.name == "Bob", "name值成功修改" );
向实例化对象增加一个新的属性和方法
- function Ninja(name){
- this.changeName = function(name){
- this.name = name;
- }
- this.changeName(name)
- }
- var ninja = new Ninja("John");
- console.log( ninja.name == "John", "在初始化时name属性就被设置" );
- ninja.changeName("Bob");
- console.log( ninja.name == "Bob", "name值成功修改" );
当没有使用new时会发生什么?
- function User(first, last){
- this.name = first + " " + last;
- }
- var user = User("John", "Resig");
- console.log( typeof user == "undefined", "因为没有new,所以User作一般函数调用,没有返回值" );
- function User(first, last){
- this.name = first + " " + last;
- }
- window.name = "Resig";
- var user = User("John", name);
- console.log( name == "John Resig", "全局属性被覆盖" );
当没有new时,它其实就是一般的函数调用,遵循函数调用的本质。
确保在错误的情况下仍然使用对象实例化
- function User(first, last){
- if ( !(this instanceof User) )
- return new User(first, last);
- this.name = first + " " + last;
- }
- var name = "Resig";
- var user = User("John", name);
- console.log( user, "即使没有使用new,仍然可以正确实例化" );
- console.log( name == "Resig", "实例化属性正常" );
通过判断this不是构造函数User的实例化对象,重新实例化,这是一个可以不使用new进行实例化的技巧。
习题:有没有更加基因化的方法做同样的事情?
- function User(first, last){
- if ( !(this instanceof ___) )
- return new User(first, last);
- this.name = first + " " + last;
- }
- var name = "Resig";
- var user = User("John", name);
- console.log( user, "即使没有使用new,仍然可以正确实例化" );
- console.log( name == "Resig", "实例化属性正常" );
用arguments.callee实现
- function User(first, last){
- if ( !(this instanceof ___) )
- return new User(first, last);
- this.name = first + " " + last;
- }
- var name = "Resig";
- var user = User("John", name);
- console.log( user, "即使没有使用new,仍然可以正确实例化" );
- console.log( name == "Resig", "实例化属性正常" );
arguments.callee引用的是函数本身。
javascript高级知识分析——实例化的更多相关文章
- javascript高级知识分析——上下文
如果函数是一个对象的属性,那么它可以? var katana = { isSharp: true, use: function(){ this.isSharp = !this.isSharp; } } ...
- javascript高级知识分析——灵活的参数
代码信息来自于http://ejohn.org/apps/learn/. 使用数量可变的参数对编程很有好处 function merge(root){ for(i = 0 ; i < argum ...
- javascript高级知识分析——作为对象的函数
代码信息来自于http://ejohn.org/apps/learn/. 函数和对象是不是非常相似? var obj = {}; var fn = function(){}; console.log( ...
- javascript高级知识分析——函数访问
代码信息来自于http://ejohn.org/apps/learn/. 可以通过函数的名字在它的内部引用它. function yell(n){ return n > 0 ? yell(n-1 ...
- javascript高级知识分析——定义函数
代码信息来自于http://ejohn.org/apps/learn/. 可以使用哪些方式来声明函数? function isNimble(){ return true; } var canFly = ...
- JavaScript的高级知识---词法分析
JavaScript的高级知识---词法分析 词法分析 词法分析方法: js运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数说明 函数在运行的瞬间, ...
- MySQL高级知识(七)——索引面试题分析
前言:该篇随笔通过一些案例,对索引相关的面试题进行分析. 0.准备 #1.创建test表(测试表). drop table if exists test; create table test( id ...
- MySQL高级知识(五)——索引分析
前言:前面已经学习了explain(执行计划)的相关知识,这里利用explain对索引进行优化分析. 0.准备 首先创建三张表:tb_emp(职工表).tb_dept(部门表)和tb_desc(描述表 ...
- 《JavaScript高级程序设计》读书笔记--前言
起因 web编程过程使用javascript时感觉很吃力,效率很低.根本原因在于对javascript整个知识体系不熟,看来需要找些书脑补一下,同时欢迎众网友监督. 大神推荐书籍 看了博客大神们推荐的 ...
随机推荐
- BMP彩色转成黑色二值图
一天半把彩色bmp转成黑白了. 原理是: 第一步:读出位图数据的偏移位置:即第11个字节,用fseek即可. 然后将偏移位置之前的数据全部写入新的bmp图中. 第二步:用fseek移到位图数据这前,判 ...
- Windows.Server.2003.R2 简体中文企业版 x86 x64(转)
两张盘,第二张是 R2安装盘. Windows.Server.2003.R2.With.Sp2 中文企业版[MSDN官方版本][32bit] Windows 2003.R2.With.Sp2 简体中文 ...
- node.async.auto
资料 GITHUB async ASYNC详解—from csdn nodejs的高性能与灵活性让服务端开发变得有了些乐趣,最近在看nodejs在服务端的一些应用,觉得其npm下的众多开源包让其虽没有 ...
- 求S=a+aa+aaa+aaaa+aa...a的值
问题描述:求S=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字,由输入a(1 <= a <= 9)表示,相加的元素个数由输入b(b<= 1000)表示. 这个算法的优 ...
- ADO.NET DataSet、DataTable、DataRow、DataView的学习
对于一个datatable中的数据进行嵌套查询判断某几列数据是否相同从而确定这条数据是否一样,并确定他重复的次数COUNT1字段. 例如: DataTable dt = new DataTable() ...
- JavaScript检测原始值、引用值、属性
上周写过一篇读书笔记<编写可维护的JavaScript>之编程实践,其中 第8章 避免『空比较』是博主在工作中遇坑较多的雷区,所以特此把该章节重新整理分享,希望大家不再坑队友(>﹏& ...
- Windows系统的安装
一.写在前面 笔者最近因为换工作,在家待业甚感无聊,于是想要整理一些在Windows系统的一些安装方法和下载资源,一来给自己做个备忘,二来把一些不成熟的想法分享出去,希望大家予以指正. ...
- SQL Server 死锁检查
示例代码 select spid, blocked, status, hostname, program_name, hostprocess, cmd from sysprocesses -- kil ...
- input file 样式以及获取选择文件方法集合
样式一(http://www.cnblogs.com/jason-liu-blogs/archive/2013/06/13/3133377.html) <style> a{display: ...
- C#5 复习总结循环 迭代和穷举
一.章节复习: 循环.反复执行某段语句一种语法形式. 1.基本语法: for( 初始条件 ; 循环条件 ; 状态的改变 ) { 循环体 } 循环的四要素. 循环的执行过程.初始条件--循环条件--循环 ...