Padrão de cadeia de protótipo (básico)

Padrão de cadeia de protótipo (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

O padrão construtor tem o conceito de classe e instância, e instâncias e instâncias são independentes umas das outrasidentificação de instância

案例一拓展
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

O modo protótipo baseado no modo construtor resolve o problema de métodos ou propriedades públicas

Extraia as mesmas propriedades e métodos entre instâncias em propriedades e métodos públicos e
coloque-os em creatjsPerson.prototype se desejar que sejam públicos

1. Princípio

1), cada tipo de dado de função (função ordinária, classe) tem uma propriedade embutida: prototype (prototype), e esta propriedade é o valor de um tipo de dado de objeto
2), e no protótipo, o navegador nasce para dar Ele adicionou um construtor de propriedade (construtor), o valor da propriedade é a própria função atual (classe)
3), cada tipo de dado do objeto (objeto comum, instância, protótipo...) também vem com uma propriedade: proto , o valor da propriedade é the current O protótipo da classe à qual a instância pertence (protótipo)

案例二
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 é a classe base de todos os tipos de dados de objetos em js (a classe de nível superior)

1), f1 instanceof Object>>true>> Porque f1 pode olhar para o superior através de __proto__, não importa quantos níveis, Object sempre pode ser encontrado no final
2), não há atributo __proto__ em object.prototype

3. Modo de cadeia de protótipos

f1.hasOwnProperty("x");
hasOwnProperty é uma propriedade de f1

Mas descobrimos que não existe tal método na propriedade privada de f1, então como lidar com isso?

1) Ao obter o valor do atributo através do método "nome do objeto.nome do atributo", primeiro pesquise no atributo privado do objeto, caso este atributo exista no privado, obtém-se o valor do atributo privado.

1. Se não houver um privado, use __proto__ para encontrar o protótipo da classe a que pertence (as propriedades e métodos definidos no protótipo da classe são todos propriedades e métodos públicos da instância atual). Se o protótipo existir , o valor da propriedade pública é obtido.

2. Se não houver protótipo, continue a pesquisar para cima através de __proto__ no protótipo até que Object.prototype seja encontrado
. O mecanismo desta pesquisa é o modo de cadeia de protótipos

案例三
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.hasOwnProperty>>f1. proto . proto .hasOwnProperty

No navegador IE, nosso modo de protótipo é o mesmo princípio, mas o navegador IE tem medo de que você modifique o público por meio de __proto__ e proíba o uso de __proto__

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

Acho que você gosta

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