前几日学习原型链的一些知识,今天在这里总结下继承的一些学习姿势
继承是什么?
总的来说对象的一个新类,从现有的类中派生,这个过程称之为继承。
继承的好处:减少重复的代码,比如父类已经提供的方法,子类可以直接使用,不必再去实现。
不过JS的继承不像其他面向对象语言的继承有着诸如“父类”和“子类”的概念,父类的的属性和方法子类可以继承而不必重写,只需要写出新增或者改写的内容。JS是基于对象的语言,没有类的概念,所以,要想实现继承,就需要用js的原型链或者用 apply 和 call 方法。
有几种常见创建对象的方式? 举例说明?
直接创建。
1
2
3
4
5
6
7
8
9
10
11
12
13var show={
name:"z-one",
age:"23",
say:function(){
console.log("my name is:"+"sss");
}
}
var show1={
name:"acorn",
age:"22",
say:function(){
console.log("my name is:"+"sss");
}构造函数
1
2
3
4
5
6
7
8
9
10
11var show=function(name,age){
this.name=name;
this.age=age;
this.say=function(){
console.log("my name is:"+this.name)
}
}
var p1=new show("acorn","23"),
p2=new show("zqy","24");
p2.say();
p1.say();工厂模式
1
2
3
4
5
6
7
8
9
10
11
12function show(name,age){
var o={
name:name,
age:age,
say:function(){
console.log("myname is:"+name)
}
}
return o;
}
var p1=show("acorn","23"),
p2=show("z-one","22")原型模式
1
2
3
4
5
6
7
8function show(){};
show.prototype.name="acorn";
show.prototype.age="22"
show.prototype.say=function(){
console.log("my name is:"+this.name)
}
var p1= new show(),
p2= new show()原型和构造函数相结合
1
2
3
4
5
6
7
8
9
10var show=function(name,age){
this.name=name;
this.age=age;
}
show.prototype.say=function(){
var _this=this;
console.log("my name is:"+_this.name)
}
var p1=new show("acorn","22"),
p2=new show("Z-one","21");
下面两种写法有什么区别? (难度:*)
1 | //方法1 |
Object.create
有什么作用?兼容性如何?如何使用?
Object.create
是什么?
Object.create(proto [, propertiesObject ]) 是E5中提出的一种新的对象创建方式,第一个参数是要继承的原型,如果不是一个子函数,可以传一个null,第二个参数是对象的属性描述符,这个参数是可选的。使得后者完全继承前者的属性,前者成为后者的原型。
如何使用
例如1
2
3
4
5
6
7
8
9
10
11function show(name,age){
this.name=name;
this.age=age;
}
show.prototype.say=function(){
console.log("my name is:"+this.name);
}
var p=new show("acorn",23);
var p1=Object.create(p)
兼容性:
凡实现ECS5标准的浏览器,都能使用,IE9以上
hasOwnProperty有什么作用? 如何使用?
hasOwnProperty()
函数用于指示一个对象自身(不包括原型链)是否具有指定名称的属性。如果有,返回true
,否则返回false
。
该方法属于
Object
对象,由于所有对象都是Object
的一个实例,因此几乎所有的对象都可以使用该方法。此方法不会检查对象的原型链中是否存在该属性,该属性只有是对象本身的一个成员才会返回true。
如何使用
例如
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20function show(){
this.name="acorn";
this.age=23;
}
show.prototype={
say:function(){
console.log("my name is:"+this.name);
},
sade:function(){
console.log("测试下")
}
}
var p=new show();
console.log(p.hasOwnProperty("name"));//true
console.log(p.hasOwnProperty("age"));//true
console.log(p.hasOwnProperty("say"));//false
//say 方法继承自原型链,因此为false
当然如果要查看对象(包括原型链)是否具备指定的属性,可以用in操作符
console.log("say" in p);//true
console.log("name" in p)//true
关于Object.create的 polyfill的内部实现
1 | function create(obj){ |
如下代码中call的作用是什么?
1 | function Person(name, sex){ |
补全代码,如何实现继承
1 | function Person(name,sex){ |