Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript原型和___;以及getPrototypeOf问题_Javascript_Prototype Programming - Fatal编程技术网

Javascript原型和___;以及getPrototypeOf问题

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 } ,

我有一个简单的javascript类:

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