关于js的一切对象都继承自Object的质疑
通过这一句
console.info(Object.prototype instanceof Object);
结果输出false
故怀疑关于js的一切对象都继承自Object的质疑
欢迎大家积极讨论
[解决办法]
js的一切对象都继承自Object这个是js的设计理念,而Object.prototype不是Object的实例这个是设计上的技巧。在原型链中如果不断开这个的话,就变成死循环了。
[解决办法]
typeof Object.prototype == 'object'
总有个初始推动的把
[解决办法]
instanceof判断的是实例是否为某个类的实例,你这样用不对吧,prototype又不是实例。。
[解决办法]
楼主本身就用错了.
<script>
function theforever()
{
var t = 'I'm theforever @ csdn.net!';
this.ok = function() {
alert(t);
}
}
var a=new theforever();
alert(a instanceof theforever); //正确
alert(a.prototype instanceof theforever); //错误
</script>
function A(){}
function B(){}
a = new A();
a instanceof A; //true
a.__proto__ = B.prototype
a instanceof A; //false
a instanceof B; //true
// LZ一直在说的都是继承啊, 原型啊神马的, 而又是用 instanceof 这个运算符去验证的
// 那我们不妨去看一看在JS标准中 instanceof 这个运算符到底是如何工作的:
var isInstanceOf = A instanceof B;
/*
算法是:
Step 1) 如果 A 不是对象, 直接返回 false
Step 2) 令 O = B.prototype
Step 3) 如果 O 不是对象类型, 抛出 TypeError 异常
Step 4) 循环 {
A = A.[[Prototype]];
if (A == null) return false;
if (A == O) return true;
}
*/
//==============
//下面来分析LZ给出的两段代码
// No.1
Object.prototype instanceof Object // false
/*
根据上面给出的算法, 可得:
O = Object.prototype;
V = Object.prototype.[[Prototype]]; (第一次循环)
由常识(算是常识吗, 原型链结束于null)可得 Object.protytype.[[Prototype]] == null
所以, 根据 Step 4 里的第一个 if() 直接返回 false.
也就是LZ看到的最终结果 false
*/
// No.2
function Teacher() {}
Teacher.prototype instanceof Object; // true
/*
根据上面给出的算法, 可得:
O = Object.prototype;
A = Teacher.prototype.[[Prototype]] = Object.prototype; (第一次循环)
根据算法 O == A, 返回 true
*/
Teacher.prototype.[[Prototype]] = Object.prototype;
/*
Teacher.prototype 为 new Object() 加一点操作得到(),
所以 Teacher.prototype.[[Prototype]] = Object.prototype
*/