function Person(name) {
this.name = name;
this.say = function() {
console.info('I am ' + this.name);
}
}
var p=new Person('stackoverflow');
有人告诉我上述代码等于:
function Person(name) {
this.name = name;
this.say = function() {
console.info('I am ' + this.name);
}
}
var p={};
Person.call(p,'stackoverflow');
这是真的吗?
如果是这样,原型怎么样?
javascripte中的每个对象都拥有一个原型,原型链保持着对象的关系,我想知道这个原型是否做了什么。
在这个例子中,当创建'p'的对象时,它是否调用了Person的超类的一些内置方法?
顺便说一句,我想知道的是语法var p=new Person('stackoverflow');
做了什么?
-----------------更新------------------
function Person(name) {
this.name = name;
}
Person.prototype.say = function() {
console.info('I am ' + this.name);
}
如果我把说法的定义放在人物功能中怎么样:
function Person(name) {
this.name = name;
Person.prototype.say = function() {
console.info('I am ' + this.name);
}
}
答案 0 :(得分:2)
代码:
var p=new Person('stackoverflow');
创建Person类的新实例。你必须记住javascript中的类是函数,所以当你调用时:
Person.call(p,'stackoverflow');
您只是调用Person函数并将其绑定到p对象(这意味着在函数上下文中this
将引用p对象)。这些代码片段做同样的事情,除了第一个是类的实例的事实,所以如果你更新person的原型对象,它的属性将被更新。
无论如何,填充Person函数的原型对象时情况会有所不同:
Person.prototype={test:"test"}
如果在Person函数声明之后添加它,您将看到这些代码片段具有不同的行为。用“new”初始化的对象将包含test属性,但另一个没有它。发生这种情况是因为原型对象在使用“new”时仅应用于类的实例。
答案 1 :(得分:0)
嗯,实际上
var p=new Person('stackoverflow');
相当于:
var p={};
p.__proto__ = Person.prototype;
Person.call(p,'stackoverflow');
除了__proto__
不是标准JavaScript(但受到支持)
一些实现)。