javascript是面向对象的,怎么体现javascript的继承关系?

javascript是面向对象的,怎么体现javascript的继承关系?

阅读 13k
15 个回答

b是A的一个实例,而echo是A类的一个方法,你说说b为何不能访问

一个简单的例子:

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()方法
      

专业的看楼下~

通过的原型继承就是对象的_proto_属性

如果觉得javascript的原型链继承方式有点奇怪一时不能接受,那建议使用typescript,或者直接写ES6。

题主这个例子,是没有体现继承关系的,传统的继承关系,至少的两个对象才能体现。

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);

ES6

原型继承,去看一下《高级程序设计》的JavaScript面向对象编程这章。

大致有6种继承方式
1.原型链继承
2.借用构造函数
3.采用原型链和借用构造函数的组合继承
4.原型式继承
5.寄生式继承
6.寄生组合式继承

具体实现方式参考《JavaScript高级程序设计》(第三版)
第6章 面向对象的程序设计 
  6.3 继承
讲解的非常详细了。

1.原型继承
2.构造函数继承
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();

推荐问题
宣传栏