构造函数中的“使用严格”是不是扩展到原型方法?

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 构造函数中的属性与原型上属性优先级的比较

javascript中 原型对象中的 例如:obj.prototype.constructor指向错误,不是指向构造函数本身,那有啥影响?

JS高级 构造函数和原型 + 继承 + ES5新增方法