Javascript 使用';新';关键词
我正在学习JavaScript,对它的对象概念感到困惑。我曾经是一名Java程序员,JavaScript没有类让我感到害怕。 据我目前所知,函数可以替代JavaScript中的类。您可以使用下面的“Javascript 使用';新';关键词,javascript,object,Javascript,Object,我正在学习JavaScript,对它的对象概念感到困惑。我曾经是一名Java程序员,JavaScript没有类让我感到害怕。 据我目前所知,函数可以替代JavaScript中的类。您可以使用下面的“new”关键字来实例化该函数 function person() { var name; this.tellYourName = function() { return 'My name is ' + name; } this.setName = fun
new
”关键字来实例化该函数
function person() {
var name;
this.tellYourName = function() {
return 'My name is ' + name;
}
this.setName = function(newName) {
name = newName;
}
}
var person1 = new person();
person1.setName('Chris');
alert(person1.tellYourName());
在上面的代码中,我创建了一个对象“person1”,继承person函数的属性
这是我的问题。
person()是对象吗?我所说的对象是指person()
是类还是实例化对象
我在研究闭包时被这个概念弄糊涂了。
下面是示例代码
function closureTest(a) {
return function(b) {
return a + b;
}
}
var test = closureTest(1);
alert(test(2));
在这里,我猜closureTest函数作为一个方法而不是一个类工作。而var检验=closureTest(1)代码>行未使用“new
”关键字。这意味着测试变量将存储closureTest(1)的返回值
但是正如您所看到的,test变量被用作closureTest
的对象。这怎么可能?因为当我用下面的测试代码尝试它时
function test(a) {
return a;
}
var t = test(2);
alert(t);
按照我的预期打印出测试函数的返回值
我希望我的问题不要太令人困惑。我现在从Java转向JavaScript,我认为它们几乎是一样的想法是完全错误的。我读了几篇关于JavaScript中对象概念的讲座,但它变得更加混乱。
感谢您花时间阅读本文,并希望我能从您那里得到一些信息:)首先了解新关键字。可以这样想:在函数body in person函数期间,您存储在this
上的任何内容都会在创建新实例时传递。
所以newperson()返回这个
以及您在这个
上设置的任何函数
关于第二个问题,将其视为返回另一个函数的函数。它返回的是一个函数,而不是一个对象。函数在技术上是一个对象。因此,当您调用closuretest(1)
时,基本上是返回
var test= function(b) {
return 1+b;
}
现在如果调用test(2),它将变成return1+2=3
希望这有助于一些理论观察:)
对象是类的实例化这一概念对于理解JavaScript毫无帮助。JavaScript涉及原型继承,而不是经典继承。换句话说,对象从继承链上的其他对象继承属性,而不是从类继承属性
首先,函数是JavaScript中的对象。这意味着函数可以有方法
其次,如果使用new
前缀调用函数,则会创建一个新对象。此新对象将链接到函数的原型,但此
将引用新对象。设计用于new
的函数称为构造函数
第三,实现同一目标的方法多种多样。所以你可以这样做:
// The capital for the function indicates a constructor function
function Person(name) {
this.name = name;
}
Person.prototype.tellYourName = function() {
return 'My name is ' + this.name;
};
Person.prototype.changeName = function(newName) {
this.name = newName;
};
var person1 = new person("Chris"),
random_string = person1.tellYourName(); // Chris
或者,您也可以不使用new
实现相同的功能
function person(name) {
// myName is a private variable
var myName = name; // This line is actually unnecessary if you use name throughout
return {
// Public methods
tellYourName: function() {
return 'My name is ' + myName;
},
setName: function(newName) {
myName = newName;
}
}
}
var person1 = person("Chris"); // Note that `new` is not used
后者通常是首选的,因为它具有数据隐藏功能。换句话说,获取属性名称的唯一方法是使用公共方法。上面显示的示例是两种不同的用例。在javascript中,所有事物都被视为对象。当您对函数使用new关键字时,您的函数对象将被视为一个类,使用this引用的变量是类的属性,例如
var Person = function(){
this.name = null;
this.age = 0;
};
这被视为具有名称和年龄的Person类的属性,该属性可用于类的实例/对象Person,对象被创建为
var someone = new Person();
//someone.name and someone.age are valid then.
但是,如果不使用,则函数内部的不会将其创建为类,因此它将充当一个正常函数,如示例2所示,该示例返回另一个可使用的对象/函数。
有关此问题的更多说明,请阅读本主题的相关链接。在JavaScript中使用“new
”关键字时,它会执行几个步骤。首先,它创建了一个新的对象实例和提供的函数原型,在您的例子中是person。第二步是使用新创建对象的有界上下文调用提供的函数。最后一步是返回一个新创建的对象。因此,对象创建的神奇之处在于新的操作符。你可以读一下我理解你的困惑。Java和JavaScript唯一的共同点是类似C的语法和名称。除此之外,Java和JavaScript是两种截然不同的编程语言:
Java是一种经典的面向对象编程语言。JavaScript是一个很好的工具
在Java中,函数必须是类的方法。在JavaScript中,函数是。这使得JavaScript比Java强大得多
Java起源于C/C++。JavaScript将其起源追溯到Self和Scheme
与Java不同,JavaScript不仅是一种面向对象的编程语言,而且还是一种函数式编程语言(尽管不如Haskell或OCaml那样功能强大)。因此函数在JavaScript中扮演着重要角色
JavaScript中的函数可用于:
创建对象的模板(即,行为类似于类)
封装状态和行为(即,表现得像一个
共享功能并减少冗余(即,表现得像计算机)
作为类的函数
JavaScript没有类,因为它是一种原型的面向对象编程语言。不幸的是,它隐藏在构造函数后面,使它看起来更像Java。然而,这只会使Java程序员难以理解JavaScript中的继承
例如,假设您在Java中有以下Rectangle
类:
public class Rectangle {
public int width;
public int height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
public int area() {
return this.width * this.height;
}
}
在JavaScript中,您可以编写以下内容:
function Rectangle(width, height) {
this.width = width;
this.height = height;
}
Rectangle.prototype.area = function () {
return this.width * this.height;
};
function CLASS(prototype) {
var constructor = prototype.constructor;
constructor.prototype = prototype;
return constructor;
}
var Rectangle = CLASS({
constructor: function (width, height) {
this.width = width;
this.height = height;
},
area: function () {
return this.width * this.height;
}
});
如果你不喜欢这种语法,你可以用l