js 继承

577 阅读3分钟

所谓继承关系不过是把一个对象的原型指向另一个对象而~~~~~~~~~~~~~
我们需要牢记两点:①__proto__和constructor属性是对象所独有的;
② prototype属性是函数所独有的,因为函数也是一种对象,所以函数也拥有__proto__和constructor属性。


__proto__属性的作用就是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(父对象)里找,一直找,直到__proto__属性的终点null,然后返回undefined,通过__proto__属性将对象连接起来的这条链路即我们所谓的原型链。
Object.prototype.__proto__ === null //true

prototype属性的作用就是让该函数所实例化的对象们都可以找到公用的属性和方法,即f1.__proto__ === Foo.prototype。

constructor属性的含义就是指向该对象的构造函数,所有函数(此时看成对象了)最终的构造函数都指向Functionfunction P1() { }
        function P2() { }
            //原型对象增加属性和方法
            P2.prototype.name = 'P2"s name';
            P2.prototype.get = function (value) {
                return value;
            }
            //实例化P2构造函数的一个对象
            var obp2 = new P2();//这个对象应该包含所有原型对象的属性和方法
            //给P1的原型对象赋值一个对象,相当于P1继承了obp2的所有属性和方法
            P1.prototype = obp2;//这个式子,简单来讲就类似于a = b, b赋值给a这个总该明白吧?
            //调用P1从obp2继承过来的get函数
            alert(P1.prototype.get('out"s name'));
            //展示P1从obp2继承过来的name属性
            alert(P1.prototype.name);
            //用构造函数P1实例化一个obp1对象
            var obp1 = new P1();
            //P1的原型对象prototype既然已经继承了obp2的所有属性和函数,那么依据P1所实例化出来的对象也都有obp2的属性和函数了
            alert(obp1.get('obp1"s name'));
            console.log(new P1().get(9)
--------------------- 
https://blog.csdn.net/cc18868876837/article/details/81211729

2. 搞一个清空字符串的自定义方法clean
String.prototype.clean=function(){
        return "";
    };
    var str="三尺龙泉万卷书";
    alert(str.clean());


Object.create()方法可以传入一个原型对象,并创建一个基于该原型的新对象,但是新对象什么属性都没有,因此,我们可以编写一个函数来创建xiaoming:

// 原型对象:
var Student = {
    name: 'Robot',
    height: 1.2,
    run: function () {
        console.log(this.name + ' is running...');
    }
};

function createStudent(name) {
    // 基于Student原型创建一个新对象:
    var s = Object.create(Student);
    // 初始化新对象:
    s.name = name;
    return s;
}

var xiaoming = createStudent('小明');
xiaoming.run(); // 小明 is running...
xiaoming.__proto__ === Student; // true
Object.create(proto, [propertiesObject])
//方法创建一个新对象,使用现有的对象来提供新创建的对象的proto。
参数:
proto : 必须。表示新建对象的原型对象,即该参数会被赋值到目标对象(即新对象,或说是最后返回的对象)的原型上。该参数可以是null, 对象, 函数的prototype属性 (创建空的对象时需传null , 否则会抛出TypeError异常)。
propertiesObject : 可选。 添加到新创建对象的可枚举属性(即其自身的属性,而不是原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()的第二个参数。



非构造函数的继承
  var Chinese = {
        nation: '人类'
    };
    var Doctor = {
        career: '我'
    }
    function object(o) {
            function F() { }
            F.prototype = o;
            return new F();
        }

     var Doctor = object(Chinese);//在父对象的基础上,生成子对象:
     Doctor.career = '我';//再加上子对象本身的属性:
    alert(Doctor.nation); //人类
    
    es6继承
    class Person {
  constructor(name) {
    this.name = name;
  }

  printName() {
    console.log(this.name);
  }
}

class Bob extends Person {
  constructor() {
    super("111111");
    this.hobby = "Histroy";
  }

  printHobby() {
   
  }
}

console.dir(new Bob().name);//111111
  

mp.weixin.qq.com/s?__biz=MjM…