当前位置: 首页 > news >正文

网站架设流程专门app软件制作费用

网站架设流程,专门app软件制作费用,帝国cms网站迁移,怎样有效的做网上宣传文章目录JavaScript原型与原型链:对象的"家族传承"系统 👨👩👧👦引言:为什么需要原型?原型系统三大核心概念概念关系图核心概念表一、原型基础:对象如何"继承"属…

文章目录

  • JavaScript原型与原型链:对象的"家族传承"系统 👨👩👧👦
    • 引言:为什么需要原型?
    • 原型系统三大核心概念
      • 概念关系图
      • 核心概念表
    • 一、原型基础:对象如何"继承"属性
      • 1. 创建对象与原型关系
      • 2. 原型链查找机制
    • 二、深入原型链:多级继承
      • 1. 原型链示意图
      • 2. 实现继承的完整例子
      • 3. 原型链关系验证方法
    • 三、原型系统的六大核心机制
      • 1. `new` 操作符的工作流程
      • 2. 构造函数、原型与实例的关系
      • 3. 原型链的终点
      • 4. 属性屏蔽规则
      • 5. 原型污染与防范
      • 6. 现代替代方案:Class语法
    • 四、原型系统的实际应用
      • 1. 方法共享(节省内存)
      • 2. 猴子补丁(Monkey Patching)
      • 3. 对象组合与混入(Mixin)
    • 五、常见误区与最佳实践
      • 1. 常见错误
      • 2. 最佳实践
      • 3. 原型调试技巧
    • 总结:原型系统的设计哲学

在这里插入图片描述

JavaScript原型与原型链:对象的"家族传承"系统 👨👩👧👦

引言:为什么需要原型?

想象JavaScript世界是一个巨大的家族,每个对象都是这个家族的成员:

  • 问题:如果每个家庭成员都从头开始学习所有知识(每个对象都独立拥有全部属性和方法),效率极低
  • 解决方案:家族智慧通过"血脉"传承(原型继承)
  • 结果:后代可以自动获得祖先的知识和能力,无需重复学习

这就是JavaScript原型系统的设计初衷——高效共享属性和方法

原型系统三大核心概念

概念关系图

构造函数 (Constructor) → 实例 (Instance)↓
.prototype (原型对象)↑
.__proto__ (原型链接)

彻底搞懂JavaScript原型和原型链-CSDN博客

核心概念表

概念说明类比家庭关系
构造函数用于创建对象的函数父母
实例通过构造函数创建的对象孩子
原型对象包含共享属性和方法的对象家族共享的知识库
__proto__实例指向原型对象的链接血脉传承
prototype构造函数的原型属性父母准备给孩子的知识库

一、原型基础:对象如何"继承"属性

1. 创建对象与原型关系

// 1. 创建一个构造函数(父母)
function Person(name) {this.name = name;
}// 2. 在原型上添加方法(家族共享知识)
Person.prototype.greet = function() {console.log(`Hello, my name is ${this.name}`);
};// 3. 创建实例(孩子)
const alice = new Person('Alice');
const bob = new Person('Bob');// 4. 调用方法
alice.greet(); // Hello, my name is Alice
bob.greet();   // Hello, my name is Bob// 检查原型关系
console.log(alice.__proto__ === Person.prototype); // true
console.log(Object.getPrototypeOf(alice) === Person.prototype); // true (标准方法)

2. 原型链查找机制

当访问对象属性时,JavaScript会:

1. 检查对象自身属性 → 有则返回
2. 没有则检查__proto__指向的原型对象 → 有则返回
3. 重复步骤2直到找到或到达null
// 继续上面的例子// 1. 直接访问实例属性
console.log(alice.name); // "Alice" (自身属性)// 2. 访问原型方法
alice.greet(); // 方法在原型上找到// 3. 添加自身方法会覆盖原型方法
alice.greet = function() {console.log(`Special greeting from ${this.name}`);
};
alice.greet(); // Special greeting from Alice (优先使用自身方法)
bob.greet();   // Hello, my name is Bob (仍然使用原型方法)// 4. 检查属性存在性
console.log('name' in alice); // true (自身属性)
console.log('greet' in alice); // true (原型链上存在)
console.log(alice.hasOwnProperty('name')); // true
console.log(alice.hasOwnProperty('greet')); // false (原型上的)

二、深入原型链:多级继承

1. 原型链示意图

实例 alice↓ __proto__
Person.prototype↓ __proto__
Object.prototype↓ __proto__
null

2. 实现继承的完整例子

// 父类(基类)
function Animal(name) {this.name = name;
}// 父类原型方法
Animal.prototype.eat = function() {console.log(`${this.name} is eating.`);
};// 子类(派生类)
function Dog(name, breed) {Animal.call(this, name); // 调用父类构造函数this.breed = breed;
}// 设置原型链继承
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog; // 修复constructor指向// 子类原型方法
Dog.prototype.bark = function() {console.log(`${this.name} (${this.breed}) says: Woof!`);
};// 创建实例
const myDog = new Dog('Rex', 'Labrador');// 方法调用
myDog.eat();  // Rex is eating. (继承自Animal)
myDog.bark(); // Rex (Labrador) says: Woof! (自身方法)// 检查原型链
console.log(myDog.__proto__ === Dog.prototype); // true
console.log(myDog.__proto__.__proto__ === Animal.prototype); // true
console.log(myDog instanceof Dog); // true
console.log(myDog instanceof Animal); // true

3. 原型链关系验证方法

方法用途示例
instanceof检查对象是否是某构造函数的实例obj instanceof Constructor
isPrototypeOf检查对象是否在另一个对象的原型链上Parent.prototype.isPrototypeOf(child)
Object.getPrototypeOf获取对象的原型Object.getPrototypeOf(obj)
hasOwnProperty检查属性是否是对象自身属性obj.hasOwnProperty('prop')

三、原型系统的六大核心机制

1. new 操作符的工作流程

当执行 new Constructor() 时:

1. 创建一个空对象 {} 
2. 设置该对象的__proto__指向Constructor.prototype
3. 将构造函数内的this绑定到这个新对象
4. 执行构造函数代码(初始化属性)
5. 如果构造函数没有返回对象,则返回这个新对象

2. 构造函数、原型与实例的关系

function Person(name) {this.name = name;
}const alice = new Person('Alice');// 关系验证
console.log(Person.prototype.constructor === Person); // true
console.log(alice.__proto__ === Person.prototype); // true
console.log(alice.constructor === Person); // true (通过原型链查找)

3. 原型链的终点

所有原型链最终都会指向 Object.prototype,而 Object.prototype.__proto__null

console.log(Object.prototype.__proto__); // null// 完整的原型链示例
function Foo() {}
const foo = new Foo();// 原型链:
// foo → Foo.prototype → Object.prototype → null

4. 属性屏蔽规则

当对象和原型有同名属性时:

  • 对象自身属性优先("屏蔽"原型属性)
  • 设置属性只会影响对象自身,不会修改原型
function Person() {}
Person.prototype.name = 'Prototype Name';const p1 = new Person();
const p2 = new Person();p1.name = 'Instance Name';console.log(p1.name); // 'Instance Name' (自身属性)
console.log(p2.name); // 'Prototype Name' (原型属性)

5. 原型污染与防范

原型污染:修改原型会影响所有实例

// 危险操作 - 修改内置原型
Array.prototype.push = function() {console.log('Array push modified!');
};
[].push(); // 所有数组实例受影响// 防范方法
Object.freeze(Array.prototype); // 冻结原型防止修改

6. 现代替代方案:Class语法

ES6的class本质是原型继承的语法糖

class Person {constructor(name) {this.name = name;}greet() {console.log(`Hello, ${this.name}`);}
}// 等同于
function Person(name) {this.name = name;
}
Person.prototype.greet = function() {console.log(`Hello, ${this.name}`);
};

四、原型系统的实际应用

1. 方法共享(节省内存)

// 所有实例共享同一个方法,而不是每个实例创建副本
function Car(model) {this.model = model;
}Car.prototype.drive = function() {console.log(`${this.model} is driving`);
};const car1 = new Car('Tesla');
const car2 = new Car('BMW');console.log(car1.drive === car2.drive); // true (同一个方法)

2. 猴子补丁(Monkey Patching)

// 在运行时修改或扩展已有类型
const arr = [1, 2, 3];// 添加自定义方法(谨慎使用)
Array.prototype.last = function() {return this[this.length - 1];
};console.log(arr.last()); // 3

3. 对象组合与混入(Mixin)

// 通过原型实现混入模式
const canEat = {eat: function() {console.log(`${this.name} is eating`);}
};const canSleep = {sleep: function() {console.log(`${this.name} is sleeping`);}
};function Person(name) {this.name = name;
}// 混入多个行为
Object.assign(Person.prototype, canEat, canSleep);const p = new Person('Alice');
p.eat();   // Alice is eating
p.sleep(); // Alice is sleeping

五、常见误区与最佳实践

1. 常见错误

// 错误1:忘记使用new操作符
function Person(name) {this.name = name;
}
const p = Person('Alice'); // this指向全局对象!
console.log(name); // 'Alice' (污染全局)// 错误2:直接重写prototype对象
function Foo() {}
Foo.prototype = { // 会丢失constructormethod1: function() {}
};
// 应该保持constructor
Foo.prototype = {constructor: Foo,method1: function() {}
};// 错误3:在继承中破坏原型链
function Parent() {}
function Child() {}
Child.prototype = Parent.prototype; // 错误 - 修改Child会影响Parent
// 正确做法
Child.prototype = Object.create(Parent.prototype);

2. 最佳实践

  1. 方法放在原型上:共享方法节省内存
  2. 属性放在构造函数中:实例特有属性
  3. 使用Object.create设置继承:保持原型链完整
  4. 不要修改内置原型:避免不可预测行为
  5. 考虑使用class语法:更清晰的继承语法

3. 原型调试技巧

function Person(name) {this.name = name;
}
Person.prototype.greet = function() {console.log(`Hello, ${this.name}`);
};const p = new Person('Alice');// 1. 查看对象自身属性
console.log(Object.keys(p)); // ['name']// 2. 查看所有可枚举属性(包括原型链)
for (let key in p) {console.log(key); // 'name', 'greet'
}// 3. 检查属性来源
console.log(p.__proto__.hasOwnProperty('greet')); // true

总结:原型系统的设计哲学

JavaScript的原型系统是其面向对象编程的核心,理解它能让你:

  1. 真正掌握JavaScript对象模型:不再只是"使用"对象,而是"理解"对象
  2. 编写更高效的代码:合理利用原型共享,减少内存消耗
  3. 实现复杂的继承结构:构建可维护的大型应用
  4. 深入理解现代框架:React/Vue等框架底层都涉及原型概念
  5. 应对高级面试问题:原型相关问题是JavaScript面试的必考点

记住这个简单公式:

JavaScript对象 = 自身属性 + 原型链查找

原型系统就像JavaScript对象的DNA,它决定了对象如何"出生"、如何"成长"、以及如何"传承"特性。掌握了它,你就掌握了JavaScript面向对象编程的精髓。

http://www.dtcms.com/a/435995.html

相关文章:

  • 计算机网站建设维护的目的wordpress 系统需求
  • 无形资产 网站建设官方网站建设与维护好处
  • 程序员用来做笔记的网站网站源码绑定域名
  • 网站建设开发ppt模板德州建设街小学网站
  • 【代码随想录day 34】 力扣 62.不同路径II
  • 哪些公司做网站好河南营销型网站建设
  • 做网站需要写程序绿色营销案例100例
  • 【Linux】进程间通信(1)
  • 域名所有人是网站名不能转出用凡科做网站要钱吗
  • asp.net网站开发上网站开发哪家公司电话
  • 个人做的网站有什么危险吗万网官网域名注册多少钱
  • 网站机房建设成本某公司网络营销现状分析
  • 服务器主机 网站安阳企业网站优化外包
  • DS container adapters <B> priority_queue in Huffman Algorithm 2/99
  • 英语学习-Saints042
  • 建立网站条件一级域名如何分发二级域名
  • wordpress发布失败手机网站优化需要注意什么
  • 北京模板网站建设wordpress远程本地化
  • 【P0】Spring Cloud 面试篇
  • freertos内部机制
  • 苏州公司做变更网站建筑工程网站建设
  • 广州最好网站建设公司石家庄网站制作仓谷
  • 腾讯企点客户通长沙网站seo推广公司哪家好
  • 如何查看网站是哪家公司做的?双wordpress自动同步文章
  • 婚礼策划公司优化推广网站怎么做最好
  • 天津企业设计网站建设wordpress注册不成功
  • 何为“类”?(Java基础语法)
  • 德城区建设局网站建设部特殊工种查询网站
  • 如何做优化网站的原创性文章济南移动互联网开发
  • 建设部标准定额研究所网站c2c网站建设方案