ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板,通过关键字class,可以定义类,基本上,ES6的class可以看成只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰, 更像买你想对象编程的语法而已
知识点:
(1)class声明类
(2)constructor定义构造函数初始化
(3)extends继承父类
(4)super调用腹肌构造方法
(5)static定义静态方法和属性
(6)父类方法可以重写
案例1:es5构造函数创建对象
// ES5构造函数实例化对象
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
//添加方法
Person.prototype.sayName = function () {
console.log(this.name);
};
//实例化对象
let p = new Person("张三", 18, "male");
console.log(p.sayName());
案例2:es6 class创建对象
// ES6 class 创建对象
class Person {
//构造函数 名字不能和修改
constructor(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
//添加方法
//方法必须使用该语法 不能使用es5的对象完整形式
sayHi() {
console.log(`我是${this.name},你好啊`);
}
}
let p = new Person("lisi", 18, "female");
console.log(p.sayHi());
静态成员
//静态成员
function Person() {}
Person.name = "wangmei";
Person.sayHi = function () {
console.log("Hi");
};
let p = new Person();
console.log(p.name); //undefined 也就是说实例身上是没有构造函数对象身上的属性的
console.log(p.sayHi()); //Uncaught TypeError: p.sayHi is not a function 说明实例身上没有构造函数对象身上的方法的 实例和构造函数身上的属性是不相通的
构造函数身上的属性是属于函数对象的,实例对象不能访问,对于这样的属性,我们称之为静态成员,对于class而言,被static标记的成员是属于class的,而不是实例对象的,如下所示:
class Person {
//静态属性
static name = "static";
static sayHi() {
console.log("Hi");
}
}
let p = new Person();
console.log(p.name);//undefined
console.log(p.sayHi);//undefined
案例3:es5 实现继承
function Person(name, age) {
this.name = name;
this.age = age;
}
//添加方法
Person.prototype.sayHi = function () {
console.log("Hi");
};
// 子类
function Student(name, age, grade, score) {
//通过call 让Perosn的this指向Student的实例对象 继承父类的name age属性
Person.call(this, name, age);
this.grade = grade;
this.score = score;
}
//设置子级构造函数的原型
Student.prototype = new Person();
// 将子类的构造器还原
Student.prototype.constructor = Student;
//生命子类的方法
Student.prototype.study = function () {
console.log("I love study");
};
//实例化子类对象
let s = new Student("danny", 2, 1, 100);
console.log(s);
案例4:es6 类继承
class Person {
//构造方法
constructor(name, age) {
this.name = name;
this.age = age;
}
//父类的方法
sayHi() {
console.log(`Hi,我是${this.name}`);
}
}
// 子类继承自父类
class Student extends Person {
constructor(name, age, grade, score) {
super(name, age);
this.score = score;
this.grade = grade;
//子类的方法
}
study() {
console.log("I love Studying");
}
eat() {
console.log("I love eating");
}
}
//实例化子类对象
let s = new Student("lili", 12, 3, 100);
console.log(s.name); //lili
从这两个案例可以看出,es6的类继承更简单,更切合面向对象编程,需要注意的是,如果子类中的方法父类中也定义了,那我们是无法直接调用父类的同名方法的,相当于重写了父类的方法
案例5:es6中的get和set
//class中的get和set
class Person {
get name() {
console.log("name属性被读取了");
return "11";
}
set name(newVal) {
console.log("name属性被修改了");
}
}
let s = new Person();
console.log(s.name);
s.name = "你好";
假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案
由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A
是否有可能以某种方式访问Class.new范围内的a?a=5Class.new{defb;aend}.new.b#NameError:undefinedlocalvariableormethod`a'for#:0x007fa8b15e9af0>#:in`b' 最佳答案 即使@MarekLipka的回答是正确的——改变变量范围总是有风险的。这是可行的,因为每个block都带有创建它的上下文,因此您的局部变量a突然变得不那么局部了——它变成了一个“隐藏的”全局变量:a=5object=Class.new{define_method(
classFooincludeModule.new{class_eval"deflab;puts'm'end"}deflabsuperputs'c'endendFoo.new.lab#=>mc======================================================================classFooincludeModule.new{instance_eval"deflab;puts'm'end"}deflabsuperputs'c'endend注意这里我把class_eval改成了instance_evalFoo.new.labresc
玩转Rails和Controller继承。我创建了一个名为AdminController的Controller,其中一个名为admin_user_controller的子类位于/app/controllers/admin/admin_user_controller.rb这是我的routes.rbnamespace:admindoresources:admin_user#Havetheadminmanagethemhere.endapp/controllers/admin/admin_user_controller.rbclassAdminUserController应用程序/Contr
我正在尝试升级到Rails4beta1,但遇到了一些问题。简而言之,这就是我的应用程序Controller的样子。classApplicationControllercaches_action在Rails4中移到了它自己的gem中,因此包含gem应该可以解决问题。gem"actionpack-action_caching",github:"rails/actionpack-action_caching"但是当我运行我的请求规范或在浏览器中访问该应用程序时,我收到此错误。app/controllers/application_controller.rb:3:in`':undefinedm
这个问题在这里已经有了答案:Rubymetaclassconfusion(4个答案)关闭7年前。我对Ruby对象模型不太了解。首先,Ruby中的一切都是Class的实例吗??这些都产生true:pObject.instance_of?(Class)pClass.instance_of?(Class)pModule.instance_of?(Class)pBasicObject.instance_of?(Class)classHello;endpHello.instance_of?(Class)我不太明白这怎么可能,如果Object是Class的父类(superclass),它怎么可能都
我不明白下面这段代码中的Sheep=Class.new部分。moduleFenceSheep=Class.newdodefspeak"Bah."endendenddefcall_sheepFence::Sheep.new.speakend它到底在做什么? 最佳答案 根据文档,Class.newCreatesanewanonymous(unnamed)classwiththegivensuperclass(orObjectifnoparameterisgiven).此外,Youcangiveaclassanamebyassigning
我觉得Object是每个人的祖先,包括Class。所以我觉得应该是Class.class==Object。感觉有点迷茫和扭曲 最佳答案 class返回类(#type)而不是祖先。对象的类是Class。Class的类(class)是Class。类是一个对象。广告中的真相:我从未学过Ruby,但对象类关系必须是Smalltalk30年前提出的那种关系。 关于ruby-为什么Object.class==Class在Ruby中?,我们在StackOverflow上找到一个类似的问题:
我有一个表单,我想出现在每个页面的顶部,所以我将它包含在/app/views/layouts/application.html.erb文件中,但我收到错误undefinedmethodmodel_name'forNilClass:Class`尝试加载页面时。这是application.html.erb中的表单片段Addnewcontact这是我的/app/controllers/user_controller.rbclassUserController我认为我遇到了这个错误,因为表单位于application.html.erb文件中,我需要以某种方式指定路径,但话又说回来,我对Rail