js原型
JavaScript规定,每个函数有一个prototype对象属性,指向另一个对象(原型链上面的)。
prototype(对象属性)的所有属性和方法,都会被构造函数的实例继承。这意味着,我们可以把哪些不变(公用)的属性和方法,直接定义在prototype对象属性上。prototype就是调用构造函数所创建的那个实例对象的原型(proto)。
prototype可以让所有对象实例共享它所包含的属性和方法。也就是说,不必构造函数中定义对象信息,而是可以直接将这些信息添加到原型中。
// es5方法
// 通过函数创建类
function Person(name, age) {
// 对象属性
this.name = name;
this.age = age
}
// 对象方法
Person.prototype = {
showName() {
return '我的名字叫:' + this.name
},
showAge() {
return '我的今年:' + this.age
}
}
// 实例化对象
let person = new Person('齐天大圣1', 18)
// 调用对象的方法
console.log(person.showName())
console.log(person.showAge())
/
//es6方法
class point{
// 它是一函数,它的名字是固定的:constructor(构造器)
//在new 实例时,它会被自动调用,并传入实参
//一个class必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加
constructor(name,age){
this.name=name ;
this.age=age;
}
// 以下是构造函数原型上的方法
showName() {
return '我的名字叫:' + this.name
}
showAge() {
return '我的今年:' + this.age
}
}
// new 方法创建新对象
let p=new point("齐天大圣2",18)
console.log(p.showName())
console.log(p.showAge())
js原型链
每个对象都可以有一个原型_proto_,这个原型还可以有它自己的原型,以此类推,形成一个原型链。
查找特定属性的时候,我们先去这个对象里去找,如果没有就去它原型对象里去,如果还是没有的话再去向原型对象的原型对象里去寻找…这个操作被委托在原型链上,这就是我们说的原型链了。
//js 原型链实现类的继承
//es5方法
//父类
function father(name) {
// 对象属性
this.name = name;
}
//父类的原型方法
father.prototype.getName=function(name){
return '我的名字叫:' + this.name;
}
//子类
function Child(name){
father.call(this,name)
}
Child.prototype=new father();
var z = new Child("齐天大圣3");
console.log(z.getName(name));
// 让子类的原型对象指向父类实例,
//这样一来在Child实例中找不到的属性和方法就会到原型对象(父类实例)上寻找
// 根据原型链的规则,顺便绑定一下constructor,
// 这一步不影响继承, 只是在用到constructor时会需要
/
//es6
class point2{
constructor(name,age){
this.name=name ;
this.age=age;
}
}
class sexpoint2 extends point2{
constructor(name,age,sex){
// 在子类型构造函数中通过super调用父类型的构造函数
super(name,age);
this.sex=sex
}
toSex(){
return "名字:"+this.name+" 年龄:"+this.age+" 性别:"+this.sex
}
}
let sext=new sexpoint2("齐天大圣4",18,"男")
console.log(sext.toSex());
console.log(sext.name);
console.log(sext.age);
console.log(sext.sex)
原型指针
prototype属性,他是函数独有的,它从一个函数指向一个对象。他的含义是函数的原型对象,也就是这个函数所创建的实例的原型对象;
这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法(我们把这个对象叫做原型对象);
_proto_是原型链查询中实际用到的,他总是指向prototype,话句话说就是指向构造函数的原型对象,它是对象独有的。
总结
1,_proto_是原型链查询中实际用到的,他总是指向prototype;
2,prototype 是函数所独有的,在定义构造函数时自动创建,它总是被 proto 所指。
3,所有对象都有__proto__属性,函数这个特殊对象除了具有__proto__属性, 还有特有的原型属性prototype。
4,prototype对象默认有两个属性,constructor属性和__proto__属性。
5, prototype属性可以给函数和对象添加可共享(继承)的方法、属性。
6,__proto__是查找某函数或对象的原型链方式。
7,constructor,这个属性包含了一个指针, 指回原构造函数。