欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Object create()与 new

程序员文章站 2022-06-04 11:05:56
...

Object.create() 方法会使用指定的原型对象及其属性去创建一个新的对象。

返回值:在指定原型对象上添加新属性后的对象。”-------摘自MDN

通俗一点就是一个新的对象,可以继承一个对象的属性,并且可以添加新属性,小栗子:

var a = {
   name : '小七哥'
}
var b = Object.create(
    a,
    {
       age : { value : 18}    //一定要写value,不然undifined
    }
)
console.log(b):

Object create()与 new


实现类式继承:

// Shape - 父类(superclass)
function Shape() {
  this.x = 0;
  this.y = 0;
}

// 父类的方法
Shape.prototype.move = function(x, y) {
  this.x += x;
  this.y += y;
  console.info('Shape moved.');
};

// Rectangle - 子类(subclass)
function Rectangle() {
  Shape.call(this); // call super constructor.
}

// 子类续承父类
Rectangle.prototype = Object.create(Shape.prototype);// 这边会改变,Rectangle.prototype.constructor ,变成了Shape()

Rectangle.prototype.constructor = Rectangle;//重新指定回来为Rectangle()
var rect = new Rectangle();
console.log(rect instanceof Rectangle); // true
console.log(rect instanceof Shape); // true

以上通过Rectangle.prototype = Object.create(Shape.prototype)实现继承,这时候打印

Rectangle.prototype 会发现继承了Shape的原型,

那么通过Rectangle.prototype = new Shape()也可以实现继承,那么区别呢,打印Rectangle.prototype就可以看到,它是整个Shape的实例,除了继承的Shape原型外,还有Shape的实例。

下面例子也是:

        function Parent(){
		this.name = '大人类';
		this.age = 30;
	}
	Parent.prototype.getParentName=function(){
		console.log(this.name);
	}
	function Child1(){
		this.name='小人1类';
	}
	Child1.prototype=new Parent();
	console.log(Child1);
	console.log(Child1.prototype);

	function Child2(){
		this.name='小人2类'
	}
	Child2.prototype = Object.create(Parent.prototype);
	console.log(Child2);
	console.log(Child2.prototype);

Object create()与 new

new 继承过来的,在原型链上除了继承Parent原型之外还继承了其实例。这种情况下,child2实例将会无法访问到Parent中的age:

var person1 = new Child1();
var person2 = new Child2();
console.log(person1.name);// 小人1类
console.log(person1.age);//30
console.log(person2.age);//undefined
并且,通过读取person1.name我们可以看到,访问一个属性,当实例继承的构造函数中有该属性时,直接读取继承而来的属性,如果没有该属性,则去原型链上查找,如果找到则返回原型链上继承的该属性,如果找不到则返回undefined.