Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

是什么决定了JavaScript对象类型?

  假如一个人出生时是女的,伊去变了个性后变成了男的。伊的身体特征确实改变了,但是第23对染色体依然是XX。那么伊到底是男是女呢?[[Prototype]]就是JavaScript对象的身体特征,[[Class]]就是JavaScript对象的染色体,它们谁决定了JavaScript对象类型呢?
  这么一想就提升到了哲学的层面,以前有个很诡异的议题“咖喱味的大便和大便味的咖喱必须选一个你选哪个?”
  从哲学角度,这个问题就没法分析了,得从实际角度出发才行。我们为什么做对象的类型判断呢?因为JavaScript是弱类型的,函数不能overload(至少目前还不能),我们需要判断参数类型来决定函数的行为,这就是最普通的应用场景。于是我们才开始纠结用什么方式来判断对象的类型。
  就算确定了一个人的第23对染色体是XX的,但是伊也有可能是变过性的。难道要到了床上才发现接口不正确,然后抛出个TypeError吗? <script>
var o=[];
o.__proto__=null; /*变了个性*/
alert(Object.prototype.toString.call(o)); //[object Array]
我是床:try{
  o.push("臣妾做不到啊TvT");
}catch(e){
  alert(e.name); //TypeError
};
</script>
  [[Class]]是不会改变的,它可以用它来确定对象初始类型。但是我们使用一个对象时更关心它的[[Prototype]],甚至更关心对象自身的的属性。所以根据[[Class]]来判断类型意义并不大。在ES5中提供了很多公用的内置方法,这些方法就不做任何类型判断,只操作自己需要用到的属性。比如一个普通的Object实例,只要让它的[[Prototype]]为Array.prototype,它也可以实现类似数组的行为(当然不同的[[Class]]也具有不同的特殊性质,比如Array会自动维护length属性)。 <script>
var o=Object.create(Array.prototype);
o.push(1,2,3);
alert(o); //1,2,3
alert(Object.prototype.toString.call(o)); //[object Object]
</script>
  总之,要用什么属性就判断什么,未必要扯到类型上。JavaScript中的对象类型本来就是非常不明确,如果非要说类型,我觉得[[Prototype]]比[[Class]]更有意义。
网名:
3.84.186.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^