Javascript 在没有OOP构造的JS中创建对象
您好,我正在尝试理解如何在JS中创建对象。因此,我正在尝试使用纯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。实例
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