我对javascript中“原型”的概念感到困惑。
当我定义一个对象时,以下两个似乎都有效:
myObject = {};
myObject.prototype.method1 = function() { ... };
myObject.prototype.method2 = function() { ... };
myObject.prototype.method3 = function() { ... };
和...
myObject = {};
myObject.method1 = function() { ... };
myObject.method2 = function() { ... };
myObject.method3 = function() { ... };
有人可以对此有所了解吗?这两种创建对象的方式究竟有什么区别,为什么我会选择另一种呢? (我觉得这种感觉很重要......)
谢谢!
答案 0 :(得分:8)
您应该仅在Constructor Functions使用prototype
属性,而不是对象实例,例如:
function Test () {}
Test.prototype.method1 = function () {/*...*/};
var obj = new Test();
构造函数的prototype
属性由new
运算符在创建新对象实例时使用。
所有本机对象都有一个隐藏的链接,用于构建原型链。
对象之间的隐藏链接是[[Prototype]]
内部属性,new
运算符是唯一可以设置它的人。
在上面的例子中,obj
在内部与它的构造函数原型相关联,method1
可以从obj
访问,但它在物理上不存在于该对象上,该方法存在于Test.prototype
对象上,并通过原型链检索,例如:
typeof obj.method1; // "function"
obj.hasOwnProperty('method1'); // false
obj.method1 === Test.prototype.method1; // true
在对象实例上,分配prototype
属性是没有意义的,它将被视为任何其他属性名称:
var myObject = {};
myObject.prototype = "foo";
myObject.bar = "bar";
// myObject is simply {"prototype":"foo","bar":"bar"}
答案 1 :(得分:1)
第二种方法仅为此对象添加方法。第一种方法使其可用于使用此“类型”new
创建的其他对象。