需要学习对象继承和代码清理java脚本的方向

时间:2015-01-07 16:15:42

标签: javascript prototypal-inheritance

我真的修复了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中一样)来理解原型继承,那将是很棒的。

1 个答案:

答案 0 :(得分:0)

好。这就是事情。 JS中有一些概念在开始时看起来很复杂,但实际上非常简单。让我们来看看其中的一些。

1)function.prototype属性

当你定义一个函数时,JS引擎会创建一个匿名对象,并使用属性名prototypeconstructor来绑定这两个对象,如下所示:

function foo(){}

/* Performed by JS engine internally */
// foo.prototype = {};
// foo.prototype.constructor = foo;

因此,只有函数有.prototype

.prototype仅用于且仅在使用new运算符调用该函数时使用。

2)参考文献

在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

3)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/

进行长时间阅读