2017-10-19 83 views

回答

5

不,这不是反模式。在js中它是一个反模式,因为js是动态,因此更改原型会更改代码的工作方式在运行时使其成为反模式。这也是非常危险的基础上如何运营工作,并根据事实,你可以重写一切,所以改变的原型就可以在网页上的某个地方影响代码:

Number.prototype.toString = function(){ 
return "bullshit"; 
}; 

alert(""+12); 

在科特林这是不是因为kotlin是静态,并且所有参考都是在编译时间。此外,你不能覆盖现有的方法,所以它根本就没有危险。

1

几种语言已经有了。正如链接的答案中所述,JavaScript的问题是它的工作方式。

除了我的头顶,JavaScript有一些重写属性的方法。一个库可以很好地定义一个覆盖,但另一个覆盖它。从两个库中调用的函数,所有的地狱都打破了。

在我看来,这更多的是一个类型系统和可见性问题。

扩展欢迎:)

1

你不能比较JS和Kotlin这样的原型语言。所有扩展名都是静态解析的,并且不修改扩展类型(“接收者”)。这非常重要,并使您的担心无效。请看documentation以了解更多关于在后台使用扩展名(编译器)发生的事情。

恕我直言,你需要谨慎扩展。不要让Kotlin项目中的每个开发人员都为随机类型添加新的扩展。我认为项目必须定义某些规则来处理在现有类型上定义新函数/属性的过程,否则会难以阅读外部代码。此外,应该有坚定的安排位置放置这些扩展。

+0

“不要让Kotlin项目中的每个开发人员都为随机类型添加新扩展” - >我并不认为这是个问题。扩展功能在特定范围内定义,必须导入才能使用。你甚至可以在你的班级中创建本地私人扩展功能。创建扩展函数时不会污染全局名称空间。 – marstran

+0

但是,当然,只有一个大的“Extensions.kt”文件,所有的扩展函数都是坏的。你必须适当地确定它们的范围。但这是你必须做的一切,而不仅仅是扩展功能。 – marstran

+0

这不是我所建议的;-)然而,一些纪律是必需的。你是对的,其他任何事情都是如此 – s1m0nw1

0

而不是在StackOverflow上提出问题,你应该编译这个例子并看到生成的代码。一切都会变得清晰:

function replaceSpaces($receiver) { 
    return replace($receiver, 32, 95); 
} 
function foo(str) { 
    var formatted = replaceSpaces(str); 
} 

根本没有猴子补丁!扩展函数只是Kotlin中的一个语法糖。这只是将第一个参数传递给静态函数的另一种方式。

相关问题