构造函数中的“使用严格”是不是扩展到原型方法?
Posted
技术标签:
【中文标题】构造函数中的“使用严格”是不是扩展到原型方法?【英文标题】:Does "use strict" in the constructor extend to prototype methods?构造函数中的“使用严格”是否扩展到原型方法? 【发布时间】:2014-10-15 10:38:30 【问题描述】:我试图弄清楚“use strict”的定义是否扩展到构造函数的原型方法。示例:
var MyNamespace = MyNamespace || ;
MyNamespace.Page = function()
"use strict";
;
MyNamespace.Page.prototype =
fetch : function()
// do I need to use "use strict" here again?
;
根据Mozilla,您可以将其用作:
function strict()
"use strict";
function nested() return "And so am I!";
return "Hi! I'm a strict mode function! " + nested();
是不是说原型方法继承了构造函数的严格模式?
【问题讨论】:
着急,好久没看这个了,不知道有没有答案。但似乎相关:ejohn.org/blog/ecmascript-5-strict-mode-json-and-more 你可能想看看What does "use strict" do in javascript, and what is the reasoning behind it? 基本上"use strict"
的作用域就像函数中的普通变量一样。
AFAIK "use strict"
具有字面源代码范围,与 Javascript 用于对象方法的任何继承模型无关。
严格模式仅适用于函数范围和所有嵌套在其中的内容,这就是 Mozilla 代码 sn-p 所显示的内容。原型方法不属于其构造函数的函数范围,所以我怀疑它会继承它。
这是怎么复制的?建议的链接提到了严格模式,但不是在同一上下文中!!!
【参考方案1】:
没有。
严格模式确实扩展到所有后代(阅读:嵌套)范围,但由于您的 fetch
函数不是在构造函数内部创建的,因此它不会被继承。您需要在每个原型方法中重复该指令。
相反,当构造函数处于严格模式时,特权方法将处于严格模式。为避免您的情况重复,您可以
a) 通过将指令移到脚本的第一行来使整个程序变得严格,或者b) 将您的类包装在模块 IIFE 中,并使其严格:
… = (function()
"use strict";
function Page()
// inherits strictness
Page.prototype.fetch = function()
// inherits strictness
;
return Page;
());
【讨论】:
清晰、简洁并建议一个好的解决方案。唯一认为我可能会做不同的是删除命名空间。另外,值得一提的是,建议的解决方案通常用于编译为 JavaScript 的语言,如 CoffeeScript 和 TypeScript。 “删除命名空间”是什么意思?只是为了解释?随意编辑代码,如果我不喜欢它,我会恢复;-)以上是关于构造函数中的“使用严格”是不是扩展到原型方法?的主要内容,如果未能解决你的问题,请参考以下文章
javascript 构造函数中的属性与原型上属性优先级的比较
javascript中 原型对象中的 例如:obj.prototype.constructor指向错误,不是指向构造函数本身,那有啥影响?