测试代码:
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()定义一个函数的理解,需要的朋友可以参考下
* 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....
protected是本族级别以下内部访问 private是不提供非本地访问 三:ByVal sender As Object, ByVal e As System.EventArgs 这是最赏用事件传递参数。被封装于两个对象内, 如果你要传递相应的参数,要在这两个...
遇到的问题,首先是js对象的封装,js没有提供类的机制,唯一... } 不过这样有一个问题,每当我new一个新的myClass实例的时候,内部的function都会重新开辟空间,返回引用给functionName。但这个和我们设想的类不一致,
function functionName($param1, $param2) { // 函数体 return $result; } 在上面的代码中,functionName是函数的名称,$param1和$param2是函数的参数,函数体内是函数的具体实现,return $result;用于返回函数的...
web3.php 一个与以太坊区块链和生态系统进行交互的php接口。安装为开发人员设置最低稳定性"minimum-stability":...$ web3 = new Web3 ( 'http://localhost:8545' );使用提供者use Web3 \ Web3 ;use Web3 \ Providers \
S=1/2反铁磁海森堡自旋链规则掺杂S=1杂质的蒙特卡罗模拟,金丰平,徐兆新,运用蒙特卡罗模拟方法研究了S=1/2各向同性反铁磁自旋链规则掺杂S=1杂质的效应.我们的数值结果揭示了随着S=1杂质浓度的变化出现两种交
此资源为snmp4j的源码 SNMP4J——一个支持java管理器和代理,支持snmp应用程序接口的类库。 SNMP4J是一个商业类库,而且开源免费,它也是一个有着很高技术艺术性的SNMP执行能力的类库,支持J2SE1.4或更高的版本。...
End Sub Function FunctionName(参数1, 参数2,…) … FunctionName = 返回值 End Function 调用方法: Sub直接用 SubName 参数1, 参数2,… Function如果不要返回值,用 FunctionName 参数1, 参数2,… 如果要返回值...
var unit = new SNUnit ( ) ; 参数是可选的,因为您可以稍后设置它们。 设置设置(设置) 设置设置功能 @param {Function} setup 一个设置函数 unit . setSetup ( functionName ) ; setTeardown(拆解) 设置...
New-FunctionName - Parameter1 ' C:\Packages ' - Parameter2 ' C:\NewPackages ' 在TemplatePowerShellModule中使用功能2 在TemplatePowerShellModule中使用功能1的说明 Get-Function2 - Parameter1 ' ...
--- functionName: empty --- fileName: empty --- functionName: empty --- fileName: empty --- functionName: empty --- fileName: empty --- functionName: bar --- fileName: /home/raynos/projects/node-core-...
函数是由事件驱动的或者当它被调用时执行的...1、普通调用:functionName(实际参数…) 2、通过指向函数的变量去调用: var myVar = 函数名; myVar(实际参数…); 返回函数的函数 1. 当函数无明确返回值时,返回的值
包括“ /dist/util.js”,这将创建一个全局“ util_”对象,您可以在其中访问以下函数:util_.functionname(); 贡献 叉吧! 创建功能分支: git checkout -b my-new-feature 提交更改: git commit -am 'Add ...
最新更新的微信 web 开发者工具支持了云开发 和之前免费提供的自动部署的测试环境不同,这次是生产和开发都不需要一台独立的服务器了 取而代之的是云文件,云函数和云数据库(和 Bmob 云有点像) ...
function functionName(arg0,arg1,arg2){ //函数体 } 首先是function关键字,然后是函数的名字. FF,Safrai,Chrome和Opera都给函数定义了一个非标准的name属性,通过这个属性可以访问到函数指定的名字.这个函数的值...
表单中加入<input type="hidden" validatorType="javascript" functionName="functionname">(此时emptyInfo等属性无效) 时将调用function属性中指定的javascript方法(要求方法返回true或false,返回false将不再...
HabKit 命令行工具,可为用户提供一组API,以操纵Habbo Hotel客户端,或仅从游戏中检索信息/数据。 要求 在此存储库中创建的所有将来的HabKit版本都将包含两个针对.NET ...[functionName] 启用客户端的内部日志功能,
functionName属性应包含functionName的名称。 任何类型的属性(@ PathParam / @ QueryParam / @ BodyParam)都应列在attributes属性中。 如果该服务使用则开发人员可以使用。 SBF实用程序前端 此应用程序提供了与...