// class Parent {
// constructor(name) {
// console.log("Parent constructor", new.target.name);
// this.name = name;
// }
// speak() {
// console.log(this.name);
// }
// }
// class Child extends Parent {
// constructor(name, age) {
// console.log("Child constructor");
// super(name);
// this.age = age;
// }
// say() {
// super.speak();
// }
// }
// const p = new Parent("P"); // "Parent constructor,Parent"
// const c = new Child("C", 15); // "Child constructor", "Parent constructor,Child"
// c.say(); // C
// console.log(Object.getPrototypeOf(Child) === Parent); // true
// console.log(Object.getPrototypeOf(Child.prototype) === Parent.prototype); // true
// console.log(c instanceof Child); // true
// console.log(c instanceof Parent); // true
// /** es5 继承 */
function Shape() {
console.log("Shape----");
this.x = 0;
this.y = 0;
}
Shape.prototype.move = function(x, y) {
console.log("shape moved");
this.x += x;
this.y += y;
}
function Rectangle() {
console.log("Rectangle----");
Shape.call(this);
}
// Rectangle.prototype.__proto__ = Shape.prototype
Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.constructor = Rectangle;
const rect = new Rectangle();
console.log(Object.getPrototypeOf(Rectangle) === Shape); // false
console.log(Object.getPrototypeOf(Rectangle.prototype) === Shape.prototype); // true
console.log(rect instanceof Rectangle); // true
console.log(rect instanceof Shape); // true
rect.move(1,1);
// Object.create = function(Base) {
// const F = function() {};
// F.prototype = Base;
// return new F();
// }
// const Base = function() {
// this.a = 10;
// }
// const o = Object.create(Base.prototype);
// console.log(o.a);
/** es6 继承 */
// const _createClass = function () {
// // 将props属性挂载到目标target上面
// function defineProperties(target, props) {
// for (let i = 0; i < props.length; i++) {
// const descriptor = props[i];
// descriptor.enumerable = descriptor.enumerable || false;
// descriptor.configurable = true;
// if ("value" in descriptor)
// descriptor.writable = true;
// // 通过defineProperty来挂载属性
// Object.defineProperty(target, descriptor.key, descriptor);
// }
// }
// // 这个才是“真正的”_createClass
// return function (Constructor, protoProps, staticProps) {
// // 如果传入了需要挂载的原型方法
// if (protoProps)
// defineProperties(Constructor.prototype, protoProps);
// // 如果传入了需要挂载的静态方法
// if (staticProps)
// defineProperties(Constructor, staticProps);
// return Constructor;
// };
// }();
// function Parent(name, age) {
// this.name = name;
// this.age = age;
// }
// _createClass(Parent, [{
// key: 'sayHi',
// value: function sayHi() {
// console.log('hi');
// }
// }]);
// const child = function (_Parent) {
// _inherits(Child, _Parent);
// function Child(name, age) {
// // console.log(this);
// var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(Child).call(this, name, age));
// // this.name = name;
// // this.age = age;
// _this.name = name;
// _this.age = age;
// return _this;
// }
// _createClass(Child, [{
// key: "getName",
// value: function getName() {
// return this.name;
// }
// }]);
// return Child;
// }(Parent);
// function _inherits(subClass, superClass) {
// subClass.prototype = Object.create(superClass && superClass.prototype, {
// constructor: {
// value: subClass,
// enumerable: false,
// writable: true,
// configurable: true
// }
// });
// // 将 subClass 设置为 superClass 的实例
// if (superClass) {
// Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
// }
// }
// function _possibleConstructorReturn(self, call) {
// return call && (typeof call === "object" || typeof call === "function") ? call : self;
// }
// const c = new child("C", 15);
// const p = new Parent("P", 40);
// console.log(c.sayHi());
// console.log(c.getName());
// console.log(c.age);
// console.log(p.age);
// console.log(p.name);