Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 在没有OOP构造的JS中创建对象_Javascript_Oop - Fatal编程技术网

Javascript 在没有OOP构造的JS中创建对象

Javascript 在没有OOP构造的JS中创建对象,javascript,oop,Javascript,Oop,您好,我正在尝试理解如何在JS中创建对象。因此,我正在尝试使用纯JS创建以下类(我知道我不能强化类型),只是将它们作为参考放在那里 期望的行为 class User{ name:String; age:number; function StateCredentials(){ return "Name:"+this.name+"\r\n"+"Age:"+this.age; } } 我不明白将原型附加到当前对象的顺序,以及何时对其调用apply。实例

您好,我正在尝试理解如何在JS中创建对象。因此,我正在尝试使用纯JS创建以下类(我知道我不能强化类型),只是将它们作为参考放在那里

期望的行为

class User{
    name:String;
    age:number;
    function StateCredentials(){
        return "Name:"+this.name+"\r\n"+"Age:"+this.age;
    }
}
我不明白将原型附加到当前对象的顺序,以及何时对其调用
apply
。实例方法应该放在哪里

当前实施情况

User=(function(age,name){
    function User(name,age){
        this.name=name;
        this.age=age;
        this.credentials=SetCredentials;
    }
    function StateCredentials(){
        return "Name:"+this.name+"\r\n"+"Age:"+this.age;
    }
    x={};
    x.__proto__= User.prototype; 
    User.apply(x,[a]); 
    return x;
});
呼叫

function createObject(){
    u=User(3,3);
    u.StateCredentials();
}
错误
Uncaught TypeError:无法读取未定义的属性“StateCresidences”

最后,我看到了一个实现,其中匿名方法是封装构造函数逻辑的触发器

(function(){...})(arugments);

您的代码有几个问题:

  • User
    函数不返回任何内容。这就是为什么
    u
    未定义的
    ,您会得到该错误。您必须添加
    返回x
  • 即使如此,调用
    u.StateCredentials()将失败,因为您从未在
    x
    上创建属性
    stateCresidences
    。最接近您的是创建属性
    credentials
    ,因此您可以执行
    u.credentials()
  • 但您仍然看不到任何内容,因为您没有使用返回值执行任何操作。您可以执行
    console.log(u.credentials())

总的来说,我不太确定你想要实现什么。忽略您的类示例在语法上不正确,
class
es是“纯JavaScript”。自2015年以来,语法正式成为该语言的一部分

我觉得不同的人对什么是“OPP结构”有不同的理解,所以这里有几个例子

语法(构造函数+原型)

class
或多或少只是语法上的糖分。在后台,我们处理正常的构造函数。因此,如果您询问等效的类前语法示例是什么样子的,它将是这样的:

功能用户(姓名、年龄){
this.name=名称;
这个。年龄=年龄;
}
User.prototype.StateCredentials=函数(){
返回“Name:+this.Name+”\r\n“+”Age:+this.Age;
}
var u=新用户('foo',42);

console.log(u.StateCredentials())您的代码有几个问题:

  • User
    函数不返回任何内容。这就是为什么
    u
    未定义的
    ,您会得到该错误。您必须添加
    返回x
  • 即使如此,调用
    u.StateCredentials()将失败,因为您从未在
    x
    上创建属性
    stateCresidences
    。最接近您的是创建属性
    credentials
    ,因此您可以执行
    u.credentials()
  • 但您仍然看不到任何内容,因为您没有使用返回值执行任何操作。您可以执行
    console.log(u.credentials())

总的来说,我不太确定你想要实现什么。忽略您的类示例在语法上不正确,
class
es是“纯JavaScript”。自2015年以来,语法正式成为该语言的一部分

我觉得不同的人对什么是“OPP结构”有不同的理解,所以这里有几个例子

语法(构造函数+原型)

class
或多或少只是语法上的糖分。在后台,我们处理正常的构造函数。因此,如果您询问等效的类前语法示例是什么样子的,它将是这样的:

功能用户(姓名、年龄){
this.name=名称;
这个。年龄=年龄;
}
User.prototype.StateCredentials=函数(){
返回“Name:+this.Name+”\r\n“+”Age:+this.Age;
}
var u=新用户('foo',42);

console.log(u.StateCredentials())或者您可以将类用于较新的浏览器

class User {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  StateCredentials() {
    return "Name:"+this.name+"\r\n"+"Age:"+this.age;
  }
}

let u = new User('name', 31);

console.log(u.StateCredentials());

或者,您可以将类用于较新的浏览器

class User {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  StateCredentials() {
    return "Name:"+this.name+"\r\n"+"Age:"+this.age;
  }
}

let u = new User('name', 31);

console.log(u.StateCredentials());

你让事情变得比实际情况复杂得多:

function user(age,name){
  this.name=name;
  this.age=age;
}

user.prototype.StateCredentials = function(){
  return "Name:"+this.name+"\r\n"+"Age:"+this.age;
}

var u = new user(12, "Little Billy");
console.log(u.StateCredentials());
var v = new user(11, "Little Suzy");
console.log(v.StateCredentials());

原型附带了
新的
关键字<代码>应用
不在本场景中使用,尽管您偶尔会在某些继承类型的构造函数中看到它。

您让它变得比必须的复杂得多:

function user(age,name){
  this.name=name;
  this.age=age;
}

user.prototype.StateCredentials = function(){
  return "Name:"+this.name+"\r\n"+"Age:"+this.age;
}

var u = new user(12, "Little Billy");
console.log(u.StateCredentials());
var v = new user(11, "Little Suzy");
console.log(v.StateCredentials());

原型附带了
新的
关键字<代码>应用
在这种情况下不使用,尽管您偶尔会在某些继承类型的构造函数函数中看到它。

设置凭据
设置为
构造函数
中的
字段(如我所做的)之间有什么区别或者通过附加到
User.prototype
属性来设置它?为什么要将实例方法设置为
prototype
字段而不是字段?请参阅,以获得关于该字段的全面答案。答案的最后一部分是真正解决我困惑的原因。您如何将所有逻辑包含在一个方法中?表现为“像构造函数一样”.你能把它全部放在一个
包装器中吗?
makeUser
基本上是一个构造函数。。。不知道你还想要什么。
UserPrototype
是在函数中定义的吗?然后每次调用
makeUser
时,我们都会创建对象和函数的新副本,虽然没有太大的区别,但我添加了另一个不使用原型的示例。将
SetCredentials
设置为
构造函数中的
字段(如我所做)或通过附加到
User.prototype
属性来设置它之间有什么区别?为什么要将实例方法设置为
prototype
字段而不是字段?请参阅以获取全面的an