gpt4 book ai didi

javascript - JavaScript 中的类变量

转载 作者:行者123 更新时间:2023-12-03 02:19:10 25 4
gpt4 key购买 nike

如何在 Javascript 中声明类变量。

function Person(){
fname = "thisfname"; //What needs to be put here
}
alert(Person.fname) //It should alert "thisFrame"

我不想使用这种方法。

function Person(){

}
Person.fname = "thisfname";
alert(Person.fname) //alerts "thisframe"

最佳答案

JavaScript 并不像其他人所说的那样有类。继承是通过原型(prototype)设计来解决的,原型(prototype)设计本质上只不过是在新创建的对象上创建不可删除的属性引用。 JavaScript 还具有简单数据对象的替代方案,即对象字面量。

JavaScript 中“类”的变体应如下定义:

// I use function statements over variable declaration 
// when a constructor is involved.
function Person(name) {
this.name = name;
}

// All instances of Person create reference methods to it's prototype.
// These references are not deletable (but they can be overwritten).
Person.prototype = {
speak: function(){
alert(this.name + ' says: "Hello world!"');
}
};

var Mary = new Person('Mary');
Mary.speak(); // alerts 'Mary says: "Hello world!"'

this 引用始终指向函数 的所有者。如果您在不使用 new 运算符的情况下调用 Person,则所有者将是全局范围(窗口)。如果您不使用此引用将属性分配给实例,则这些属性将简单地声明为变量。如果您不使用 var 语句,那么这些声明将创建不好的全局变量!

更多相关信息

如果您想向当前实例添加属性,在构造函数中使用 this 引用非常重要。如果不使用 this,您只需创建一个变量(与属性不同),并且如上所述,如果您也不使用 var 语句,您将创建全局变量。

function Person(){
name = 'Mary'
}
var p = new Person();
alert(p.name); // undefined, did not use 'this' to assign it to the instance.
alert(name); // 'Mary', boo, it created a global variable!

用这个!

function Person(){
this.name = 'Mary'
}
var p = new Person();
alert(p.name); // 'Mary', yay!
alert(name); // undefined, yay!

请注意,通过函数构造函数分配给实例的任何内容都不能继承,除非您将其分配给原型(prototype)并在函数构造函数中再次覆盖它以使其成为自有属性。

当您通过兼作构造函数的函数创建 的新实例时,实际上会发生以下情况。

pseudo code:

copy Person.prototype as person
invoke Person function on person
return person

实际上,当您创建类的实例时,这就是每种古典语言中发生的情况。但 JavaScript 的主要区别在于它没有封装在漂亮的 Class 语句中。最初 JavaScript 甚至没有函数构造函数,但后来添加了,因为 SUN 要求他们希望 JavaScript 更像 Java。

对象文字

对于仅携带内部数据且没有方法的对象,函数构造函数的替代方案是对象文字。

var Mary = {
firstName: 'Mary',
lastName: 'Littlelamb'
};

这是声明内部对象的首选方式:

// do not ever do this!
var Mary = new Object();
Mary.firstName = 'Mary';
Mary.lastName = 'Littlelamb';

通过您的技能集中的对象文字,您可以使用module pattern为内在数据对象创建工厂模式。 (通常适用于单例)。

var createPerson = function(firstName, lastName){
return {
firstName: firstName,
lastName: lastName
}
}
var Mary = createPerson('Mary', 'Littlelamb');

这实现了一些舒适的封装,但只能用于内在数据对象。

您可以使用对象文字和 JavaScript 做的另一件事是委托(delegate),这应该是首选。

var personMethods = {
speak: function(){
alert(this.firstName + ' says: "Hello world!"');
}
};

var Mary = {
firstName: "Mary",
lastName: "Littlelamb"
};

var Peter = {
firstName: "Peter",
lastName: "Crieswolf"
};

personMethods.speak.apply(Mary); // alerts 'Mary says: "Hello world!"'
personMethods.speak.apply(Peter); // alerts 'Peter says: "Hello world!"'

为什么应该首选它?因为它使您的对象保持分钟和可读性,所以即使是原型(prototype)引用也会占用内存,并且当使用继承和“子类化”时,您最终会得到具有大量未使用的方法引用的子实例。授权总是更好。

关于javascript - JavaScript 中的类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3641229/

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