Patrón de cadena prototipo (básico)

Patrón de cadena prototipo (básico)

案例一
function creat(name, age){
    
    
this.name=name;  
this.age=age;
this.write=function (){
    
    
console.log("i can write"+this.name);
};
}
var p1=new creat("xiaobai",13);
p1.write();
var p2=new creat("xiaohei",15);
p2.write();

console.log(p1.writeJs === p2.writeJs);>>false

El patrón constructor tiene el concepto de clase e instancia, y las instancias y las instancias son independientes entre sí.identificación de instancia

案例一拓展
function creat(name, age){
    
    
this.name=name;  
this.age=age;
creatjsPerson.prototype.writeJs=function(){
    
    
console.log("i can write"+this.name);
};
};
var p1=new creat("xiaobai",13);
p1.write();
var p2=new creat("xiaohei",15);
p2.write();

console.log(p1.writeJs === p2.writeJs);>>true

El modo prototipo basado en el modo constructor resuelve el problema de los métodos o propiedades públicas

Extraiga las mismas propiedades y métodos entre instancias en propiedades y métodos públicos, y
colóquelos en creatjsPerson.prototype si desea que sean públicos

1. Principio

1), cada tipo de datos de función (función ordinaria, clase) tiene una propiedad incorporada: prototipo (prototipo), y esta propiedad es el valor de un tipo de datos de objeto
2), y en el prototipo, el navegador nace para dar Agregó un constructor de propiedades (constructor), el valor de la propiedad es la función actual (clase) en sí misma
3), cada tipo de datos de objeto (objeto ordinario, instancia, prototipo...) también viene con una propiedad: proto , el valor de la propiedad es el actual El prototipo de la clase a la que pertenece la instancia (prototipo)

案例二
function Fn(){
    
    
this.x=100;
}
Fn.prototype.getX=function (){
    
    
console.log(this.x);
};
var f1=new Fn;
var f2=new Fn;
console.log(Fn.prototype.constructor === Fn);
>>true

Caso 2

2. object es la clase base de todos los tipos de datos de objetos en js (la clase de nivel superior)

1), instancia f1 de Objeto>>verdadero>> Debido a que f1 puede buscar al superior a través de __proto__, sin importar cuántos niveles, el Objeto siempre se puede encontrar al final
2), no hay atributo __proto__ en objeto.prototipo

3. Modo de cadena de prototipos

f1.hasOwnProperty("x");
hasOwnProperty es una propiedad de f1

Pero descubrimos que no existe tal método en la propiedad privada de f1, entonces, ¿cómo lidiar con eso?

1) Al obtener el valor del atributo a través del método de "nombre del objeto.nombre del atributo", primero busque en el atributo privado del objeto. Si este atributo existe en el privado, se obtiene el valor del atributo privado.

1. Si no hay una privada, use __proto__ para encontrar el prototipo de la clase a la que pertenece (las propiedades y métodos definidos en el prototipo de la clase son todas propiedades y métodos públicos de la instancia actual).Si el prototipo existe , se obtiene el valor de la propiedad pública.

2. Si no hay un prototipo, continúe buscando hacia arriba a través de __proto__ en el prototipo hasta que se encuentre Object.prototype.El
mecanismo de esta búsqueda es el modo de cadena de prototipos.

案例三
f1.getX===f2.getX>>true
f1.__proto__.getX===f2.getX
>>true
f1.getX===Fn.prototype.getX
>>true
案例三拓展
function Fn(){
    
    
this.x=100;
this.sum=function(){
    
    };
}
Fn.prototype.getX=function (){
    
    
console.log(this.x);
};
Fn.prototype.sum=function (){
    
    
console.log(this.x);
};
var f1=new Fn;
var f2=new Fn;
f1.sum===f2.__proto__.sum
>>false
f1.sum===Fn.prototype.sum;
>>false

Caso 3
2)f1.tienepropiedad>>f1. proto . proto .hasOwnProperty

En el navegador IE, nuestro modo prototipo es el mismo principio, pero el navegador IE tiene miedo de que modifique el público a través de __proto__ y prohíba el uso de __proto__

案例四
f1.sum=function(){
    
    
>>修改自己私有的sum
};
f1.__proto__.sum=function(){
    
    
>>修改所属类原型上的sum
};
Fn.prototype.sum=function(){
    
    
>>修改公有的sum
}

Supongo que te gusta

Origin blog.csdn.net/yilingpupu/article/details/105486496
Recomendado
Clasificación