Javascript原型和___;以及getPrototypeOf问题
我有一个简单的javascript类:Javascript原型和___;以及getPrototypeOf问题,javascript,prototype-programming,Javascript,Prototype Programming,我有一个简单的javascript类: function foo() { this.bar = "bar"; } var test = new foo; console.log(foo.prototype,foo.__proto__) /*output: foo { constructor: function foo() { __proto__: Object } ,
function foo() {
this.bar = "bar";
}
var test = new foo;
console.log(foo.prototype,foo.__proto__)
/*output: foo {
constructor: function foo() {
__proto__: Object
}
,
function Empty() {}
*/
console.log(test,test.prototype,test.__proto__,test.__proto__.__proto__)
/*output: foo {
bar: "bar"
__proto__: foo
}
,
undefined
,
foo {
constructor: function foo() {
__proto__: Object
}
,
Object {
...
}
*/
我不明白的是:
在第一个日志中,foo.prototype
具有\uuuuu proto\uuuuu
属性,该属性是对象
在第二个日志中,test.\uuuuuu proto\uuuuu
具有\uuuuuuu proto\uuuuu
属性,该属性是对象
何时使用\uuuu proto\uuuu
和何时使用prototype
有什么区别
更新: 在部分的实例中,有一些我不明白的地方: 如果我使用
var asd=“asd”代码>(asd)
它抛出一个类型错误
但是
如果我使用var dsa=新字符串(“dsa”)代码>(dsa)
它返回字符串
但是asd.constructor.prototype==dsa.constructor.prototype
为true
为什么(asd)
抛出错误?这是一个字符串,不是吗?始终使用prototype
或
\uuuu proto\uuuu
是非标准的,已被弃用
约翰·雷西格对此很有兴趣
test.prototype
未定义的原因是您创建了一个没有构造函数原型的新对象。下面是一个何时使用Object.getPrototypeOf
的示例
js> function foo(){}
js> typeof foo.prototype;
object
js> var f = new foo();
js> typeof f.prototype;
undefined
js> typeof Object.isPrototypeOf(f);
object
js> typeof f.constructor.prototype;
object
js> foo.prototype === Object.getPrototypeOf(f);
true
js> foo.prototype === f.constructor.prototype;
true
可以看出,JavaScript中的继承很棘手。让我们看一个例子:
js> typeof "asdf";
string
js> typeof String("asdf");
string
字符串文字的类型为字符串。作为函数调用String()
时也是如此。现在,由于new
操作符的行为,创建了一个新对象,其父对象是String()
js> var s = new String("asdf");
js> typeof s;
object
因为JS喜欢强制执行,所以可以通过以下几种方式获得字符串文本:
js> s
asdf
js> s.valueOf();
asdf
js> typeof s
object
js> typeof s.valueOf();
string
在学习JS继承时,Crockford给了我很多帮助
从Mozilla的页面:
字符串对象可以由
调用构造函数new String()。
String对象包装JavaScript的
具有
方法如下所述。全球
也可以调用函数String()
没有新的在前面创建一个
基本字符串。中的字符串文本
JavaScript是基本字符串
\uuuu proto\uuu
是对象与其原型之间的中间对象。使用它的最大好处是,您可以完全更改对象的原型链,而无需修改实例或原型
例如:
function F() {}
F.prototype.a = 1;
var f = new F();
f.__proto__ = { b : 2 };
"a" in f => false;
"b" in f => true;
但正如Jeremy所说,\uuuuuuuuuuuuuuuuuuuu
已被弃用。唯一的用例是,如果您希望向对象添加一组属性,更改其原型,而不必迭代每个属性。没什么大不了的。但正如您看到的第二个日志,test.prototype==undefined
我用示例repl输出修改了我的答案。感谢这个非常好的示例。现在我什么都懂了。我更新了我的问题。在John的博客中有一个我不理解的地方,你有Object.isPrototypeOf(f),我想你想要Object.getPrototypeOf