如图:
判断对错:
Q1:在JS 中 proto 和 constructor 属性是对象和函数都有的属性
prototype属性仅是函数对象所独有的。 由于JavaScript中一切皆对象,即函数对象也是一种对象,所以函数也拥有__proto__和constructor属性。
Q2:通过 proto 属性来连接对象直到 null 的一条链即所谓的原型链
如图,链字面意思即代表一个查找的过程,当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链
Q3:JavaScript 仅支持通过 prototype 属性进行继承属性和方法(错)
JavaScript 支持通过 prototype
属性进行继承,这是实现基于原型的继承的一种方式,但不是唯一的方式。在 JavaScript 中,除了传统的 prototype 链继承外,还有其他多种继承机制可以使用:
①原型链继承:
- 这是通过将一个构造函数的
prototype
属性指向另一个构造函数实例的方式实现的。
function Animal(name) {
this.name = name;
}
Animal.prototype.sayName = function() {
console.log(this.name);
}
function Dog(breed) {
this.breed = breed;
}
// 继承 Animal
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
Dog.prototype.bark = function() {
console.log('Woof!');
}
let myDog = new Dog('Labrador');
myDog.sayName(); // 输出: Labrador
②Constructor Stealing / Pseudo-Classical Inheritance(构造函数借用/类式继承):
- 在子类构造函数内部调用父类构造函数,并可能结合原型链继承来实现。
③Mixin Patterns(混入模式):
不依赖于原型链,而是通过合并对象属性或直接修改目标对象来实现功能共享
④Object.assign() 或 Spread Operator:
可以用来复制对象的所有可枚举属性到新对象中,也可以用于实现简单的继承。
Q4:null 有自己的原型对象(错)
null 没有原型,并作为这个原型链中的最后一个环节