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):
实现类式继承:
// 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);
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. 上一篇: MySQL的连接及数据库表的增删改查等基本管理操作
下一篇: JDBC连接各种数据库
推荐阅读
-
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
-
C#中new的用法及与override的区别分析
-
正则(JS)re=new RegExp("^\\d*$");与re=/^\d*$/;之间区别?
-
C++用new与不用new创建对象的区别
-
JS中‘hello’与new String(‘hello’)引出的问题详解
-
JavaScript 复制对象与Object.assign方法无法实现深复制
-
PHP的new static和new self的区别与使用
-
C++入门之new和delete关键字、静态成员属性与函数、this指针使用介绍
-
thinkPHP中create方法与令牌验证实例浅析
-
Sign in with the app-specific password you generated. If you forgot the app-specific password or need to create a new one, go to appleid.apple.com