<script>
/*
函数身上都有一个prototype属性,是一个对象
__proto__每个对象身上都有
构造函数或者构造类实例身上的__proto__指向构造函数或者构造类本身的prototype
constructor 一般是指实例对象的构造函数本身
*/
class Test {
constructor() {
this.c = '我是c';
}
}
console.log(Test.prototype);
/*
{constructor: ƒ}
constructor: class Test
[[Prototype]]: Object
*/
const test = new Test();
console.log(test.__proto__);
/*
{constructor: ƒ}
constructor: class Test
[[Prototype]]: Object
*/
//由此可以看出 Test.prototype === test.__proto__
console.log(Test.prototype === test.__proto__); // true
// prototype是一个对象 所有身上也有一个proto属性
console.log(
Test.prototype.__proto__,
Test.prototype.__proto__ === Object.prototype
);
/*
打印:{constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
Test.prototype.__proto__ === Object.prototype true
*/
// 原型链终点是个null
console.log(Object.prototype.__proto__); // null
// 原型链继承
Test.prototype.a = '我是a';
Object.prototype.b = '我是b';
console.log(test.a); // 我是a 通过__proto__找到a
console.log(test.b); // 我是b 通过__proto__找到b
console.log(test.c); // 我是c
console.log(test);
/*
原型链继承图
test {
c:'我是c '
__proto__:Test.prototype {
a:'我是a',
__proto__:Object.prototype {
b:'我是b'
// Object.prototype 不存在__proto__ 了 所有找不到只能返回个null
}
}
}
*/
console.log(Object.prototype.__proto__); // null 不存在 __proto__
console.log(test.e, Test.prototype.f); // undefined undefined
console.log(Test.__proto__ === Function.prototype); // true
console.log(Test.__proto__ === Function.__proto__); // true
console.log(Function.__proto__ === Function.prototype); // true
console.log(Object.__proto__ === Function.prototype); // true
console.log(Object.__proto__ === Function.__proto__); // true
console.log(typeof Function, typeof Object); // function function
// 检测自身原型链有没有某个属性值
console.log(test.hasOwnProperty('a')); // false
console.log(test.hasOwnProperty('b')); // false
console.log(test.hasOwnProperty('c')); // true
// 当前自身或者继承原型链上有没有某个属性
console.log('a' in test); // true
console.log('b' in test); // true
console.log('c' in test); // true
console.log('d' in test); // false
// constructor 指的是实例化对象的构造函数
console.log(test.constructor, test.constructor === Test);
/*
class Test {
constructor() {
this.c = '我是c';
}
}
true
*/
//Test.constructor 一个函数
console.log(
Test.constructor,
Test.prototype.constructor,
test.constructor
);
/*
打印一
ƒ Function() { [native code] }
打印二
class Test {
constructor() {
this.c = '我是c';
}
}
打印三
class Test {
constructor() {
this.c = '我是c';
}
}
*/
// constructor指向也可以被修改
class Test2 {}
const test2 = new Test2();
console.log(test2.constructor);
/*
输出结果 :
class Test2 {}
*/
test2.constructor = test.constructor;
console.log(test2.constructor);
/*
输出结果 :
class Test {
constructor() {
this.c = '我是c';
}
}
*/
</script>
javascript的prototype、__proto__、constructor
最新推荐文章于 2022-08-03 10:53:16 发布