`
deng131
  • 浏览: 662353 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

new FunctionName()的内部机制

阅读更多
测试代码:

function Dog(name) {
    this.name = name;
    Dog.prototype = {
        shout: function() { alert("I am " + this.name); }
    };
}
var dog1 = new Dog("Dog 1");
dog1.shout();

上面的代码看起来很“优美”,可一运行,却报错:“Object doesn’t support this property or method”.

在 YUI 3 学习笔记:oop 中,曾提到过,对于代码:

Fn() {};
var fn = new Fn();

new Fn() 的实际构造过程可以等价为以下伪代码:

var o = {__proto__: Fn.prototype};
Fn.apply(o);
return o;

理解了 new 的构造过程,我们可以分析上面的实例了。

首先,JS引擎在遇到函数声明 function Dog(…) 时,会给函数对象添加 prototype 属性,伪代码如下:

Dog.prototype = {constructor: Dog};

当运行到 var dog1 = new Dog(“Dog 1″) 时,内部操作:

var o = {__proto__: Dog.prototype};
Dog.apply(o);
return o;

也许你已经知道问题所在了。为了更清楚,添加点注释:

// Dog.prototype = {constructor: Dog};
var o = {__proto__: Dog.prototype};
// 此时,o = {__proto__: {constructor: Dog}}
Dog.apply(o);
// 此时,Dog.prototype = {shout: function(){...}}
return o;

显然,运行 dog1.shout() 时,dog1 的确没有 shout 方法。

考考大家:

function Dog(name) {
    this.name = name;
    Dog.prototype = {
        shout: function() { alert("I am " + this.name); }
    };
}
var dog1 = new Dog("Dog 1");
var dog2 = new Dog("Dog 2");
dog2.shout();
dog1.shout();

请问运行结果是什么?

最后,想大声疾呼:作为一门语言,JavaScript 有自己的脾性。用 Java 等代码方式去书写 JavaScript 代码,是不妥当的。在不使用框架的情况下,一次性添加多个方法时,推荐以下书写风格:

function Dog(name) {
    this.name = name;
}
Dog.prototype = {
        constructor: Dog,
        shout: function() { /* ... */ },
        run: function() { /* ... */ }
    };

分享到:
评论

相关推荐

    对new functionName()定义一个函数的理解

    主要介绍了对new functionName()定义一个函数的理解,需要的朋友可以参考下

    最新AJAX类JavaScript

    * function functionName(reAjax,status){if(status == 200)alert(reAjax.responseText);} * * 例:1:GET * var myAjax=new Ajax(); * myAjax.open("http://www.ttzx.com:88/ajax/re.php",functionName); * myAjax....

    VB.Net常用语法

    protected是本族级别以下内部访问 private是不提供非本地访问 三:ByVal sender As Object, ByVal e As System.EventArgs  这是最赏用事件传递参数。被封装于两个对象内, 如果你要传递相应的参数,要在这两个...

    关于js类的定义

    遇到的问题,首先是js对象的封装,js没有提供类的机制,唯一... } 不过这样有一个问题,每当我new一个新的myClass实例的时候,内部的function都会重新开辟空间,返回引用给functionName。但这个和我们设想的类不一致,

    PHP语言函数的定义和调用.docx

    function functionName($param1, $param2) { // 函数体 return $result; } 在上面的代码中,functionName是函数的名称,$param1和$param2是函数的参数,函数体内是函数的具体实现,return $result;用于返回函数的...

    web3.php:用于与以太坊区块链和生态系统进行交互的php接口。 本机ABI解析和智能合约交互

    web3.php 一个与以太坊区块链和生态系统进行交互的php接口。安装为开发人员设置最低稳定性"minimum-stability":...$ web3 = new Web3 ( 'http://localhost:8545' );使用提供者use Web3 \ Web3 ;use Web3 \ Providers \

    On effect of regular S=1 dilution of S=1/2 antiferromagnetic Heisenberg chains by a quantum Monte Carlo simulation

    S=1/2反铁磁海森堡自旋链规则掺杂S=1杂质的蒙特卡罗模拟,金丰平,徐兆新,运用蒙特卡罗模拟方法研究了S=1/2各向同性反铁磁自旋链规则掺杂S=1杂质的效应.我们的数值结果揭示了随着S=1杂质浓度的变化出现两种交

    snmp4j_source

    此资源为snmp4j的源码 SNMP4J——一个支持java管理器和代理,支持snmp应用程序接口的类库。 SNMP4J是一个商业类库,而且开源免费,它也是一个有着很高技术艺术性的SNMP执行能力的类库,支持J2SE1.4或更高的版本。...

    ASP中Sub和Function的区别说明

    End Sub Function FunctionName(参数1, 参数2,…) … FunctionName = 返回值 End Function 调用方法: Sub直接用 SubName 参数1, 参数2,… Function如果不要返回值,用 FunctionName 参数1, 参数2,… 如果要返回值...

    UnitTestNOW:用于服务器端脚本的 ServiceNow 单元测试实用程序

    var unit = new SNUnit ( ) ; 参数是可选的,因为您可以稍后设置它们。 设置设置(设置) 设置设置功能 @param {Function} setup 一个设置函数 unit . setSetup ( functionName ) ; setTeardown(拆解) 设置...

    TemplatePowerShellModule:模板PowerShell模块

    New-FunctionName - Parameter1 ' C:\Packages ' - Parameter2 ' C:\NewPackages ' 在TemplatePowerShellModule中使用功能2 在TemplatePowerShellModule中使用功能1的说明 Get-Function2 - Parameter1 ' ...

    node-core-analysis

    --- functionName: empty --- fileName: empty --- functionName: empty --- fileName: empty --- functionName: empty --- fileName: empty --- functionName: bar --- fileName: /home/raynos/projects/node-core-...

    javascript学习笔记(四)function函数部分

    函数是由事件驱动的或者当它被调用时执行的...1、普通调用:functionName(实际参数…) 2、通过指向函数的变量去调用:  var myVar = 函数名; myVar(实际参数…); 返回函数的函数  1. 当函数无明确返回值时,返回的值

    pula-common-util

    包括“ /dist/util.js”,这将创建一个全局“ util_”对象,您可以在其中访问以下函数:util_.functionname(); 贡献 叉吧! 创建功能分支: git checkout -b my-new-feature 提交更改: git commit -am 'Add ...

    小程序-云开发

    最新更新的微信 web 开发者工具支持了云开发 和之前免费提供的自动部署的测试环境不同,这次是生产和开发都不需要一台独立的服务器了 取而代之的是云文件,云函数和云数据库(和 Bmob 云有点像) ...

    javascript高级编程之函数表达式 递归和闭包函数

    function functionName(arg0,arg1,arg2){ //函数体 } 首先是function关键字,然后是函数的名字. FF,Safrai,Chrome和Opera都给函数定义了一个非标准的name属性,通过这个属性可以访问到函数指定的名字.这个函数的值...

    通用JS表单验证

    表单中加入<input type="hidden" validatorType="javascript" functionName="functionname">(此时emptyInfo等属性无效) 时将调用function属性中指定的javascript方法(要求方法返回true或false,返回false将不再...

    HabKit:Habbo酒店多功能套件

    HabKit 命令行工具,可为用户提供一组API,以操纵Habbo Hotel客户端,或仅从游戏中检索信息/数据。 要求 在此存储库中创建的所有将来的HabKit版本都将包含两个针对.NET ...[functionName] 启用客户端的内部日志功能,

    Social-Bot-Framework:一个将社交机器人建模,培训并将其集成到技术增强型学习应用程序中的框架

    functionName属性应包含functionName的名称。 任何类型的属性(@ PathParam / @ QueryParam / @ BodyParam)都应列在attributes属性中。 如果该服务使用则开发人员可以使用。 SBF实用程序前端 此应用程序提供了与...

Global site tag (gtag.js) - Google Analytics