gpt4 book ai didi

javascript - 为什么在 JavaScript 中为实例变量声明原型(prototype)属性

转载 作者:行者123 更新时间:2023-12-03 01:07:09 25 4
gpt4 key购买 nike

我正在尝试了解这种称为 JavaScript 的黑魔法 - 而且,我必须承认,我对此感到非常兴奋。我一直在查看代码示例,主要来自“easeljs”,因为那是我将主要使用的。我有点困惑..

我(认为我)理解使用 prototype 作为 class 变量的函数或属性与使用 this.someProp 之间的区别“实例”变量(是的,我知道 JavaScript 中没有类。)

我看过的代码,并用作我自己的代码的模板,声明 原型(prototype)变量,然后用这个引用它们,即

在构造函数中:

this.name = name;

然后声明:

Object.prototype.name;

然后,

this.name = "Freddy";

这是在用“new”调用的函数内,因此在这种情况下,据我所知,this 指的是当前对象。让我困惑的是原型(prototype)声明的作用是什么以及为什么我们用它作为实例变量?

<小时/>

澄清:在下面的代码中,我看不到 radius 的原型(prototype)声明实现了什么:

(function(){
// constructor
function MyCircle(radius){
this.radius = radius;
}
MyCircle.prototype.radius;
this.area = function(){
return 3.14*this.radius*this.radius;
};
window.MyCircle = MyCircle;
}());

最佳答案

原型(prototype)上的值具有与直接在实例上设置的属性不同的关键行为。试试这个:

// Create a constructor
function A() {}

// Add a prototype property
A.prototype.name = "Freddy";

// Create two object instances from
// the constructor
var a = new A();
var b = new A();

// Both instances have the property
// that we created on the prototype
console.log(a.name); // Freddy
console.log(b.name); // Freddy

// Now change the property on the
// prototype
A.prototype.name = "George";

// Both instances inherit the change.
// Really they are just reading the
// same property from the prototype
// rather than their own property
console.log(a.name); // George
console.log(b.name); // George

如果没有原型(prototype)继承,这是不可能的。

您可以使用 hasOwnProperty 方法测试该属性是实例属性还是原型(prototype)属性。

console.log(a.hasOwnProperty("name")); // false

实例可以覆盖prototype值。

b.name = "Chris";
console.log(b.hasOwnProperty("name")); // true
console.log(a.name); // George
console.log(b.name); // Chris

并返回到prototype值。

delete b.name;
console.log(b.hasOwnProperty("name")); // false
console.log(b.name); // George

这是原型(prototype)继承的强大部分。

在另一种模式中:

function A() {
this.name = "George";
}

每个新实例都会再次声明 this.name 变量。

将方法作为原型(prototype)上声明的函数是有意义的。所有实例可以共享一个函数,而不是在每个实例上重新声明函数定义。

就变量而言,而不是函数,原型(prototype)可以在实例未设置自己的值的情况下用作默认值。

The code in a fiddle

关于javascript - 为什么在 JavaScript 中为实例变量声明原型(prototype)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16751230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com