Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用';新';关键词_Javascript_Object - Fatal编程技术网

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

我正在学习JavaScript,对它的对象概念感到困惑。我曾经是一名Java程序员,JavaScript没有类让我感到害怕。 据我目前所知,函数可以替代JavaScript中的类。您可以使用下面的“
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