我真的修复了JS对象相关的概念。例如: Crockford说:从对象文字产生的对象链接到Object.prototype
当我输入时,现在在控制台上:
// input represented with >
> var a = {};
> console.log(Object.getPrototypeOf(a));
Object {} // <-- output
> console.log(a.prototype);
undefined
Crockford说:函数对象链接到Function.prototype(它本身链接到Object.prototype)
> function b(){};
> console.log(Object.getPrototypeOf(b));
function()
> console.log(b.prototype);
b{}
> console.log(b.prototype.prototype);
undefined
> console.log(Object.getPrototypeOf(b.prototype));
Object {}
当我执行getPrototypeOf()时,我得到了预期的输出,但是当我尝试使用prototype属性时,我得到了未定义的。无法弄清楚原因。
对于第5行,返回值是function()。有人可以解释一下吗?我希望返回一个Object。
如果有人请给我一些洞察力/良好的链接/一些类图(就像我们在java中一样)来理解原型继承,那将是很棒的。
答案 0 :(得分:0)
好。这就是事情。 JS中有一些概念在开始时看起来很复杂,但实际上非常简单。让我们来看看其中的一些。
function.prototype
属性当你定义一个函数时,JS引擎会创建一个匿名对象,并使用属性名prototype
和constructor
来绑定这两个对象,如下所示:
function foo(){}
/* Performed by JS engine internally */
// foo.prototype = {};
// foo.prototype.constructor = foo;
因此,只有函数有.prototype
。
.prototype
仅用于且仅在使用new
运算符调用该函数时使用。
在JS中,引用可用于传递变量,而不会创建副本。也许一个例子可能会有所帮助:
var a = 1;
var b = { val: 1 };
var c = { val: 1 };
var x;
/*variable cloned*/
x = a;
x++;
console.log(a); // 1
console.log(x); // 2
/*variable refernced*/
x = b;
x.val++;
console.log(b); // { val: 2 }
console.log(x); // { val: 2 }
/*variable cloned*/
x = c.val;
x++;
console.log(c); // { val: 1 }
console.log(x); // 2
object.__proto__
属性通过调用带有new
关键字的函数创建的任何对象(例如var x = new foo();
)都会有一个__proto__
属性, 对象引用由其构造函数的.prototype
属性引用。将foo.prototype
重新分配给其他人将不会影响已创建的对象。
换句话说,
function foo(){}
// foo.prototype = {};
// foo.prototype.constructor = foo;
var x = new foo();
console.log(x.__proto__ === foo.prototype); // true
此外,当您创建像var x = {};
这样的对象时,它与:
var x = new Object();
因此,x.__proto__
是Object.protoype
引用的对象。
这一切如何加起来?
foo.prototype
充当&#34;蓝图&#34;对于使用函数foo
创建的对象。
当我们创建一个对象x = new foo()
时,JS引擎会存储一个引用(链接)到#34;用于制作x
&#34;的蓝图。作为__proto__
属性。
当我执行getPrototypeOf()时,我得到了预期的输出,但是当我尝试使用prototype属性时,我得到了未定义的。无法弄清楚原因。
Object.getPrototypeOf(...)
会返回__proto__
属性,而不是prototype
。
对于第5行,返回值是function()。有人可以解释一下吗?我希望返回一个Object。
在JS中,所有数据类型都有一个关联的&#34; Wrapper&#34;功能
类似于x = {}
与x = new Object()
的相同方式,function b(){}
与b = new Function()
相同
因为b
是使用new
调用函数创建的,所以它具有__proto__
属性,是由其构造函数引用的对象&#39;原型。在这种情况下,Function.prototype
,也是函数。
仍然困惑?我建议您在http://www.javascripttutorial.net/
进行长时间阅读