JavaScript constructor prototyoe

时间:2022-04-13 12:50:33

想加深一下自己对construtcor prototype的印象所以写了这一篇文章

对象的constructor 就是Object 除了通过构造函数创建的对象意外 他的constructor 都是 JavaScript constructor prototyoe都是Object的实例

而通过构造函数创建的对象 他的constructor是指向这个构造函数的

     function Person() {
this.name = 'dzxczx';
this.sex = '男';
}
var obj = new Person();
console.log(obj.constructor);

JavaScript constructor prototyoe

prototype 是原形 是一个对象 是函数一创建就有的东西 对象没有这个东西undefined

 var obj = {
name : 'dzxczx'
}
console.log(obj.prototype);

JavaScript constructor prototyoe

函数一创建就存在prototype属性

 function func1() {
console.log(func1.prototype,typeof func1.prototype)
}
func1();

JavaScript constructor prototyoe

这个原形对象里面什么都没有 但是是存在的 这个原形里又有一个constructor属性这个属性指向当前函数

JavaScript constructor prototyoe

怎么给他添加属性方法呢 跟给对象添加是一样的

 function func1() {
}
func1.prototype.a = 10;
func1.prototype = {
b : 40
}
var obj = new func1();
console.log(obj.a);
console.log(obj.b);

都是可以的 注意func1.prototype.a要写在字面量的后面 不然是undefined

JavaScript constructor prototyoe

 function func1() {
}
func1.prototype = {
b : 40,
//constructor:'func1',
}
func1.prototype.a = 10;
var obj = new func1();
console.log(obj.a);
console.log(obj.b);

JavaScript constructor prototyoe

使用了 字面量的方式来写 会重写 constructor 重写之后不会指向 当前函数

 function func1() {
}
func1.prototype = {
b : 40,
//constructor:'func1',
alF:function() {console.log(func1.prototype.constructor)}
}
func1.prototype.a = 10;
var obj = new func1();
console.log(obj.a);
console.log(obj.b);
obj.alF();

JavaScript constructor prototyoe

我们可以自己再把他写回来 上面代码有

prototype 里面的属性和方法是共享的

 function func1() {}
func1.prototype.a = 10; var obj1 = new func1();
var obj2 = new func1();
console.log('obj1:'+obj1.a);
console.log('obj2:'+obj2.a);

JavaScript constructor prototyoe

如果对象实例中和原型中存在的属性或方法重名了 原形中的会被屏蔽 会使用实例中的

 function func1() {
this.a = 999;
}
func1.prototype.a = 10; var obj1 = new func1();
console.log('obj1:'+obj1.a);

JavaScript constructor prototyoe

hasOwnProperty 方法是检测一个属性是存在实例中还是存在原型中 如果存在实例中会返回true 不存在返回 false

 function func1() {
this.b = 999;
}
func1.prototype.a = 10; var obj1 = new func1();
console.log(obj1.hasOwnProperty('b'));
console.log(obj1.hasOwnProperty('a'));

JavaScript constructor prototyoe

in操作符是只要存在就返回true不管是实例还是原形

 function func1() {
this.b = 999;
}
func1.prototype.a = 10; var obj1 = new func1();
console.log('b' in obj1);
console.log('a' in obj1);

JavaScript constructor prototyoe

以上是 我对这两个属性的理解 如果有错误的地方请指出来 我及时修改 以免误导大家