如何可视化Function构造函数对象的表示?

时间:2015-08-31 14:48:12

标签: javascript prototypal-inheritance function-constructor

对于以下代码,


31-Aug-2015 22:44:04.592 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.endorsed.dirs=/Users/lhuang/dev/servers/apache-tomcat-8.0.20/endorsed
31-Aug-2015 22:44:04.592 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/Users/lhuang/Library/Caches/IntelliJIdea14/tomcat/Tomcat_8_0_20_FileStorageService_2
31-Aug-2015 22:44:04.592 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/Users/lhuang/dev/servers/apache-tomcat-8.0.20

下面是我对可视化上述代码表示的理解,

enter image description here

对于以下代码,

function Employee() {
  this.name = "";
  this.dept = "general";
}

下面是我对可视化上述代码表示的理解,

enter image description here

以上图表是否是此Javascript代码创建的原型链的准确表示?

注意:Javascript初学者

1 个答案:

答案 0 :(得分:4)

第一个看起来很好(除了可能是丑陋的图形,但这不是问题)。如果您关心UML,则不应将__proto__ 1 prototype放在一起,而应放在另一个之上。

另外,注意Employee构造函数没有.name 2 .dept属性非常重要。 new Employee 实例会有这些。

在第二种情况下,还有一些错误:

  • 同样,Manager函数没有reports属性。 new Manager个实例会有namedeptreports个属性。
  • 正确的原型对象是Manager.prototype,而不是Employee.prototype(其中有两个)。当然,这只是一个标签问题,但对于精确引用图形仍然很重要。
  • Manager.prototype' __proto__不是Object.prototype,而是Employee.prototype - 您使用的是Object.create Object.create(…) }。for。
  • Manager.prototype不应该标记箭头,而应标记对象本身(当然这更像是一种风格问题,你不能使用spec,对吗? )
  • constructor没有Employee.prototype属性。它确实继承了Manager中的那个。您应该考虑在代码中创建一个,请参阅Why is it necessary to set the prototype constructor?。然后它会指向__proto__

1:实际上,Object.prototypeObject.set/getPrototypeOf对象上的getter / setter属性。真实的内部原型链接(只能通过Employee访问)通常被指定为 [[prototype]]
2:事实上,public class Contact { [Key,ForeignKey("Student")] public int StudentId { get; set; } public virtual Student Student { get; set; } } 函数确实有.name property,但没有你想要的那个。