有个疑问一直没搞明白。
String.length
原文如下:
The static property String.length returns the value 1.
两个问题:
为什么 String.length == 1
static property,静态属性。在 JavaScript 中有静态属性这个概念?就像 Java一样,静态属性是属于类的属性(与实例无关,所有实例共享),但 JS中连类都没有(ES5),所以这说不通啊。
有个疑问一直没搞明白。
String.length
原文如下:
The static property String.length returns the value 1.
两个问题:
为什么 String.length == 1
static property,静态属性。在 JavaScript 中有静态属性这个概念?就像 Java一样,静态属性是属于类的属性(与实例无关,所有实例共享),但 JS中连类都没有(ES5),所以这说不通啊。
ES5
你可以把一个函数视为构造函数,进而视为一个类。而js
又可以给函数附加成员,那么这些就算是静态成员了。
至于1
,不知道,规定如此,那就如此吧…………
function Test(first, last) {
// 实例成员
this.first = first
this.last = last
}
// 当作静态成员,实例不可访问
Test.test = 'test'
// 实例可访问的成员
Object.defineProperty(Test.prototype, 'fullName', {
get() { return this.first + ' ' + this.last },
})
let t = new Test('Achael', 'Akinkaka')
console.log(Test.test) // 'test'
console.log(t.test) // undefined
console.log(t.first) // 'Achael'
console.log(t.last) // 'Akinkaka'
console.log(t.fullName) // 'Achael Akinkaka'
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
先解答第二个问题,这个其实只是搬用过来的说法而已,指属性可以直接使用,不需要 new。当然 ES6 以后就有了真正的 static 方法。
看回第一个问题,等于 1 的原因其实不在于 String
看 spec 你会发现 String 只有四个属性:
String.fromCharCode
、String.fromCodePoint
、String.prototype
和String.raw
。这个 length 其实继承于 Function.prototype 的,函数实例的 length 为声明的参数长度,String 接受一个
value
参数,所以 length 为 1