javascript是面向对象的,怎么体现javascript的继承关系?
一个简单的例子:
var A =function(){
}
A.prototype = {
v : 5,
tmp : 76,
echo : function(){console.log(this.tmp);},
} //v、tmp、echo 都是属于A的原型,
var b = new A();
b.echo(); //但是此处会发现b也可以调用A的所有原型,而b并没有声明任何echo()方法
专业的看楼下~
题主这个例子,是没有体现继承关系的,传统的继承关系,至少的两个对象才能体现。
function A(){}
function B(){
this.v=5;
this.temp = 76;
this.echo = function(){
console.log(this.temp);
}
}
A.prototype = new B();
A.prototype.constructor = A;
var b = new A();
b instanceof A; //true
b instanceof B;//true
}
用A创建了一个对象b,然后调用instanceof
,发现b既是A的实例对象,也是B的实例对象,这可不就A继承了B吗。
class A{
constructor(){
this.a="aaa";
}
}
class B extends A{
constructor(){
this.b="bbb";
}
}
var myB = new B();
console.log(myB.a);
大致有6种继承方式
1.原型链继承
2.借用构造函数
3.采用原型链和借用构造函数的组合继承
4.原型式继承
5.寄生式继承
6.寄生组合式继承
具体实现方式参考《JavaScript高级程序设计》(第三版)
第6章 面向对象的程序设计 6.3 继承
讲解的非常详细了。
大家都回复的太麻烦了。来个简单的解释。
任何一个对象都有__proto__属性, __proto__属性可以以对象[键]直接访问到值。
重点
var o = {}
o.__proto__ === Object.prototype; // true
o.__proto__ = {a : 1};
o.a === 1; // true;
o.__proto__ === Object.prototype; // false
o.__proto__.__proto__ === Object.prototype; // true;
proto 解释完毕
============= 我是分割线
proto 和函数有什么关系呢,继续
任何一个函数都有一个prototype属性,如
`
function foo () {};
foo.prototype === Object.prototype;
var f = new foo();
f.__proto__ === foo.prototype;
// 所以f[键]能访问到foo.prototype上的值;
`
G继承F
继承的本质就是 G的实例g.属性 能够访问到 F.prototype
所以我们构造g.__proto__.__proto__ === F.prototype就可以实现
function G() {
F.apply(this, [].slice.call(arguments));
}
g.__proto__ === G.prototype
所以 G.prototype.__proto__ = F.prototype 就可以实现继承。
这个才是语言的本质。
======== 吐槽分割线 ========
什么继承有这么多种方式 继承的实现方式是有很多 本质不都为了这些 甚至封装上一层访问限制。
function People() {
this.name = "Zhangsan";
this.getName = function() {
return this.name;
}
}
function Teacher() {
this.role = "teacher";
}
Teacher.prototype = new People();
8 回答4.6k 阅读✓ 已解决
6 回答3.4k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
b是A的一个实例,而echo是A类的一个方法,你说说b为何不能访问