Kotlin是否允许扩展现有类型?
Kotlin可以扩展现有的类型。例如,我们can do this:Kotlin是否允许扩展现有类型?
fun String.replaceSpaces(): String {
return this.replace(' ', '_')
}
val formatted = str.replaceSpaces()
但是JavaScript的this is an antipattern。
Kotlin是否回避了在Javascript中导致的问题?
不,这不是反模式。在js中它是一个反模式,因为js是动态,因此更改原型会更改代码的工作方式在运行时使其成为反模式。这也是非常危险的基础上如何在运营工作,并根据事实,你可以重写一切,所以改变的原型就可以在网页上的某个地方影响代码:
Number.prototype.toString = function(){
return "bullshit";
};
alert(""+12);
在科特林这是不是因为kotlin是静态,并且所有参考都是在编译时间。此外,你不能覆盖现有的方法,所以它根本就没有危险。
几种语言已经有了。正如链接的答案中所述,JavaScript的问题是它的工作方式。
除了我的头顶,JavaScript有一些重写属性的方法。一个库可以很好地定义一个覆盖,但另一个覆盖它。从两个库中调用的函数,所有的地狱都打破了。
在我看来,这更多的是一个类型系统和可见性问题。
扩展欢迎:)
你不能比较JS和Kotlin这样的原型语言。所有扩展名都是静态解析的,并且不修改扩展类型(“接收者”)。这非常重要,并使您的担心无效。请看documentation以了解更多关于在后台使用扩展名(编译器)发生的事情。
恕我直言,你需要谨慎扩展。不要让Kotlin项目中的每个开发人员都为随机类型添加新的扩展。我认为项目必须定义某些规则来处理在现有类型上定义新函数/属性的过程,否则会难以阅读外部代码。此外,应该有坚定的安排位置放置这些扩展。
而不是在StackOverflow上提出问题,你应该编译这个例子并看到生成的代码。一切都会变得清晰:
function replaceSpaces($receiver) {
return replace($receiver, 32, 95);
}
function foo(str) {
var formatted = replaceSpaces(str);
}
根本没有猴子补丁!扩展函数只是Kotlin中的一个语法糖。这只是将第一个参数传递给静态函数的另一种方式。
“不要让Kotlin项目中的每个开发人员都为随机类型添加新扩展” - >我并不认为这是个问题。扩展功能在特定范围内定义,必须导入才能使用。你甚至可以在你的班级中创建本地私人扩展功能。创建扩展函数时不会污染全局名称空间。 – marstran
但是,当然,只有一个大的“Extensions.kt”文件,所有的扩展函数都是坏的。你必须适当地确定它们的范围。但这是你必须做的一切,而不仅仅是扩展功能。 – marstran
这不是我所建议的;-)然而,一些纪律是必需的。你是对的,其他任何事情都是如此 – s1m0nw1