我是 JavaScript 的初学者,并且在前往 JavaScript原型 的路上。
根据文章here
创建原型
创建对象原型的标准方法是使用对象构造函数:
function person(first, last, age, eyecolor) {
this.firstName = first;
this.lastName = last;
this.age = age;
this.eyeColor = eyecolor;
}
使用构造函数,您可以使用new关键字从同一原型创建新对象:
var myFather = new person("John", "Doe", 50, "blue");
var myMother = new person("Sally", "Rally", 48, "green");
构造函数是个人对象的原型。
我发现自己对上面的粗线感到困惑,我认为这是绝对错误的。
原因:
alert(person.isPrototypeOf(myFather)); // false
我是否正确地这样说,因为我相信这一行:
'prototype'属性指向将被指定为原型的对象 使用'new'时使用该函数创建的实例。
答案 0 :(得分:9)
我同意术语不正确。
构造函数有一个prototype
属性,用于定义原型链中的属性和方法;但它本身不是一个对象的原型,它是构造函数。
isPrototypeOf
不是在构造函数本身上调用的,而是在构造函数的原型属性上调用的。
alert(person.prototype.isPrototypeOf(myFather)); // true
myFather
将是instanceof
person
,您可以使用以下行进行测试。
alert(myFather instanceof person); // true
答案 1 :(得分:3)
你在说什么,
'prototype'属性指向将在使用'new'时将被指定为使用该函数创建的实例原型的对象。
对我来说没有多大意义,但我认为你有正确的想法。
至少对我来说,
构造函数是个人对象的原型。
是错的。
正确的版本是:
构造函数是个人对象的构造函数。
构造函数的prototype属性是一个对象。
它包含分配给使用该构造函数实例化的对象的属性,例如:
function Person(name){
this.name = name;
}
Person.prototype = {
species: "Human"
};
使用prototype属性设置构造函数,该属性包含属性species
。
现在,如果我们这样做:
var joe = new Person("Joe");
joe是一个看起来像
的对象{
name: "Joe",
species: "Human"
}
如您所见,Person()
原型的属性被设置为Joe的正常属性。
所以我认为你有正确的想法。
答案 2 :(得分:3)
我同意你的意思 - 句子" 构造函数是你的人物对象的原型"令人困惑和不准确。相反,你的理解是正确的,尽管让我详细说明。
基本上,无论何时在JavaScript中创建函数,它都会自动在其上有一个名为.prototype
的属性,与之关联的值将是一个对象。在您的情况下,person
函数也具有此.prototype
属性。当您创建person
的新实例时,每个实例都将设置为继承自与person
函数.prototype
属性关联的对象 - 实例的原型。此继承意味着属性查找委派到此原型对象。这里的关键是,当您的person
实例查找属性时,他们将首先查找属性,如果找不到该属性,它们将会进入原型链。
看看你的例子,这是正确的:
person.prototype.isPrototypeOf( new person() );
换句话说,只要实例无法在自身找到属性,任何人的实例都知道委托到与person.prototype
相关联的对象。