代码信息来自于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高级知识分析——实例化的更多相关文章

  1. javascript高级知识分析——上下文

    如果函数是一个对象的属性,那么它可以? var katana = { isSharp: true, use: function(){ this.isSharp = !this.isSharp; } } ...

  2. javascript高级知识分析——灵活的参数

    代码信息来自于http://ejohn.org/apps/learn/. 使用数量可变的参数对编程很有好处 function merge(root){ for(i = 0 ; i < argum ...

  3. javascript高级知识分析——作为对象的函数

    代码信息来自于http://ejohn.org/apps/learn/. 函数和对象是不是非常相似? var obj = {}; var fn = function(){}; console.log( ...

  4. javascript高级知识分析——函数访问

    代码信息来自于http://ejohn.org/apps/learn/. 可以通过函数的名字在它的内部引用它. function yell(n){ return n > 0 ? yell(n-1 ...

  5. javascript高级知识分析——定义函数

    代码信息来自于http://ejohn.org/apps/learn/. 可以使用哪些方式来声明函数? function isNimble(){ return true; } var canFly = ...

  6. JavaScript的高级知识---词法分析

    JavaScript的高级知识---词法分析 词法分析 词法分析方法: js运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数说明 函数在运行的瞬间, ...

  7. MySQL高级知识(七)——索引面试题分析

    前言:该篇随笔通过一些案例,对索引相关的面试题进行分析. 0.准备 #1.创建test表(测试表). drop table if exists test; create table test( id ...

  8. MySQL高级知识(五)——索引分析

    前言:前面已经学习了explain(执行计划)的相关知识,这里利用explain对索引进行优化分析. 0.准备 首先创建三张表:tb_emp(职工表).tb_dept(部门表)和tb_desc(描述表 ...

  9. 《JavaScript高级程序设计》读书笔记--前言

    起因 web编程过程使用javascript时感觉很吃力,效率很低.根本原因在于对javascript整个知识体系不熟,看来需要找些书脑补一下,同时欢迎众网友监督. 大神推荐书籍 看了博客大神们推荐的 ...

随机推荐

  1. poj 3254 Corn Fields_状态压缩dp

    感谢:http://www.cnblogs.com/ka200812/archive/2011/08/11/2135607.html 让我搞懂了. #include <iostream> ...

  2. zlog

    zlog源码包下载地址https://github.com/HardySimpson/zlog zlog使用手册http://blog.csdn.net/yangzhenzhen/article/de ...

  3. 代码混淆 GSON完满解决

    头疼的问题,json使用了google的gson三方包,可是混淆的时候出了问题 明明已经按照gson的官方文档,把混淆脚本加上去了,却还是出问题. 今天同事找到一篇博客,关于这个问题的: 我们是将js ...

  4. 使用fat jar和exe4j把java程序打包成exe执行文件---转载的

    java应用编写测试好之后都是jar包或class文件,客户拿到这个东西后一般是不会java开发者那样在命令窗口下面输入运行的.客户要求的就是直接点击应用名称运行.java在方面做得很不友好,开发人员 ...

  5. 水平居中的两种方法margin text-align

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. VMware linux 增加根目录空间 (使用图形分区工具gparted LiveCd)

    写这篇文章的原因: 最近要给服务器Centos上的ruby版本升级,由于是第一次升级,不敢直接在服务器上操作. 所以在我的winxp上装了Vmware ,又在Vmware中装了Centos5.2. 用 ...

  7. asp.net 获取IP地理位置的几个主要接口

    腾讯的IP地址API接口地址:http://fw.qq.com/ipaddress 新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup ...

  8. Mschart应用之曲线图表spline

    本文主要是Mschart应用之曲线图表spline,实现6个模拟数据的图表,其中数据源X轴为当前系统时间,Y轴是由随机函数产生的不同范围的随机数. 首先是自定义一个数据表,然后产生的数据添加到该数据表 ...

  9. document_createElement

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  10. IIS出现Server Application Unavailable的解决办法

    在XP中IIS5.1服务器,运行asp.net出现Server Application Unavailable,经过多次查证,才发现是因为先安装了.net Framework 2.0然后安装IIS,导 ...