function doSomething(){}
doSomething.prototype.foo = "bar";
var doSomeInstancing = new doSomething();
doSomeInstancing.prop = "some value";
console.log("doSomeInstancing.prop: " + doSomeInstancing.prop);
console.log("doSomeInstancing.foo: " + doSomeInstancing.foo);
console.log("doSomething.prop: " + doSomething.prop);
console.log("doSomething.foo: " + doSomething.foo);
console.log("doSomething.prototype.prop: " + doSomething.prototype.prop);
console.log("doSomething.prototype.foo: " + doSomething.prototype.foo);
输出
doSomeInstancing.prop: some value
doSomeInstancing.foo: bar
doSomething.prop: undefined
doSomething.foo: undefined
doSomething.prototype.prop: undefined
doSomething.prototype.foo: bar
为什么doSomething.foo是undefined而不是原型链上的bar?
JavaScript中的原型链是一个概念,它描述了对象如何通过函数和属性的引用创建更复杂的对象。在JavaScript中,一个对象有一个独一无二的[[Prototype]]
属性,它指向对象的原型对象。这个原型对象可以通过定义函数来引用对象的属性和方法,也可以通过定义方法来引用对象的属性和属性。
例如,假设我们有两个对象:
```javascript var person = { name: "John", age: 30, sayHello: function() { console.log("Hello, my name is " + this.name); } };
var dog = { name: "Fido", breed: "Labrador Retriever", speak: function() { console.log("Woof, Fido!"); } }; ```
在这个例子中,person
有一个sayHello
方法,它是一个函数,它引用了person
的name
属性。同样,dog
有一个speak
方法,它也是一个函数,它引用了dog
的name
属性。
然后,我们可以使用Object.create()
方法来创建一个新的对象,它继承自一个现有的对象,也可以创建一个新的对象,它没有继承自任何对象。在JavaScript中,Object.create()
方法接受三个参数:
例如:
```javascript var person = Object.create({ sayHello: function() { console.log("Hello, my name is " + this.name); } });
var dog = Object.create({ speak: function() { console.log("Woof, Fido!"); } });
var newPerson = Object.create(person); newPerson.name = "Alice"; newPerson.age = 25;
var newDog = Object.create(dog); newDog.name = "Buddy"; newDog.breed = "Poodle"; newDog.speak = function() { console.log("Woof, Buddy!"); }; ```
在这个例子中,我们创建了一个新的Person
对象,它继承自person
对象,也添加了一个新的Person
属性和一个新的Person
方法。我们创建了一个新的Dog
对象,它继承自dog
对象,也添加了一个新的Dog
属性和一个新的Dog
方法。