【JavaScript】面向对象之原型

副业刚需
• 阅读 824

JS(JavaScript)
一.原型
1.概括

  • 原型是什么

Function对象包含数学方法的函数,函数定义在protoype属性,初始值为一个空对象
原型的属性和方法不会影响函数自身的属性和方法

// Function类型的属性 -> 所有函数都具有的属性
console.log(Function.prototype);
// 定义函数
function fn(){
    console.log('this is function');
}
// 原型的默认值是空对象
console.log(fn.prototype);
// 函数包含构造函数 -> 所有引用类型其实都是构造函数
console.log(Number.prototype);
console.log(Object.prototype);
var result = Object.getOwnPropertyDescriptor(Object.prototype, 'constructor');
console.log(result);
  • 获取原型

通过两种方式,来设置共存的属性和方法
构造函数的prototype属性
Object对象的getPrototype

function fn(){
    console.log('this is function');
}
// 使用访问对象的属性语法结构
console.log(fn.prototype);
console.log(fn['prototype']);
// Object类型提供getPrototypeOf()方法
console.log(Object.getPrototypeOf(fn));
  • 原型的属性和方法

通过一下两种方式
单独定义原型的属性和方法
直接型定义个新对象

function fn(){
    console.log('this is function');
}
// 变量proto也是一个空对象
// var proto = fn.prototype;

// 新增属性或方法
// proto.name = '犬夜叉';
fn.prototype.name = '犬夜叉';
console.log(fn.prototype);
// defineProperty()
Object.defineProperty(fn.prototype, 'age', {
    value : 18,
    enumerable : true
});
console.log(fn.prototype);

2.原型属性

  • 自有属性与原型属性

自有属性;对象引用增加属性,独立的属性函数本身的属性
原型属性;通过新增属性和方法并定义原型的属性

// 定义构造函数
function Hero(name){
    // 构造函数本身的属性 -> 自有属性
    this.name = name;
    this.sayMe = function(){
        console.log('this is function');
    }
}
// 通过构造函数Hero的prototype新增属性或方法
// 通过原型所定义的属性 -> 原型属性
Hero.prototype.age = 18;
/*
    通过构造函数Hero创建对象时
    * 不仅具有构造函数的自有属性
    * 还具有构造函数的原型属性
 */
var hero = new Hero('犬夜叉');

console.log(hero.name);// 犬夜叉
console.log(hero.age);// 16

var hero2 = new Hero('桔梗');
console.log(hero2.name);// 桔梗
console.log(hero2.age);// 16
// 为对象hero新增age属性
// hero.age = 80;
// console.log(hero.age);// 80
//
// console.log(hero);
//
// console.log(hero2.age);// 16

Hero.prototype.age = 80;

console.log(hero.age);
console.log(hero2.age);
  • 检测自有或原型属性

有两种方式以hasOwnPrototype()来检测对象是否指定自有属性
以in关键字检测对象及原型链是否有属性

function Hero(){
    // this.name = '犬夜叉';// 自有属性
}
// Hero.prototype.name = '桔梗';

var hero = new Hero();
/*
  Object.hasOwnProperty(prop)方法
  判断当前指定属性是否为自有属性
  
  prop - 表示指定属性名称
  返回值 - 布尔值
  true - 表示存在指定的自有属性
  false - 表示不存在指定的自有属性
 */
// console.log(hero.hasOwnProperty('name'));// true
/*
  使用in关键字检测对象的属性
  作用 - 判断对象中是否存在指定属性(自有属性或原型属性)
  返回值 - 布尔值
  true - 表示存在指定的属性
  false - 表示不存在指定的属性
 */
console.log('name' in hero);
  • 扩展属性或方法

以原型设置指定构造函数和对象扩展其属性和方法

Object.prototype.sayMe = function () {
    console.log('you my sayMe function')
}
var obj = new Object();

obj.sayMe();

Array.prototype.inArray = function (color) {

    for(var i = 0, len = this.length; i < len; i++){
        if(this[i] === color){
            return true;
        }
    }
    return false;
}
var arr = ["red", "green","blue"];
console.log(arr.inArray("yellow"));
console.log(arr.inArray("red"));
  • 重写原型属性

将构造函数和对象,以自有属性重写远得属性

//定义构造函数
function Hero() {
    this.name = '犬夜叉'
}
Hero.prototype.name = '桔梗';
//构造函数原型
var hero = new Hero();
// 构造函数创建对象
console.log(hero.name);//犬夜叉
//自有属性与原型属性同名,默认访问是自有属性,自有属性优先级别高于原型属性
delete hero.name;
//删除对象属性
console.log(hero.name);//桔梗
//重新访问对象属性
  • isPrototypeOF()方法
//通过初始化方式定义对象
var obj = {
    name : '犬夜叉'
}
function Hero() {}
//定义构造函数
Hero.prototype = obj;
//将对象obj赋值给构造函数Hero原型
var hero = new Hero();
//通过构造函数创建对象
var result = obj.isPrototypeOf(hero);
//判断指定对象是否是另一个对象原型
console.log(result);

3.扩展内建对象
内置对象的prototype属性设置扩展属性和方法

Object.prototype.sayMe = function () {
    console.log('you my sayMe function')
}
var obj = new Object();

obj.sayMe();

Array.prototype.inArray = function (color) {

    for(var i = 0, len = this.length; i < len; i++){
        if(this[i] === color){
            return true;
        }
    }
    return false;
}
var arr = ["red", "green","blue"];
console.log(arr.inArray("yellow"));
console.log(arr.inArray("red"));
点赞
收藏
评论区
推荐文章
菜园前端 菜园前端
2年前
前端学习重点-原型与原型链
原文链接:什么是原型?每一个函数都包含一个prototype属性,这是一个指针指向"原型对象"(prototypeobject),也就是我们平时说的原型。每一个函数都包含不同的原型对象。当将函数用作构造函数的时候,新创建的对象(实例)会从原型对象上继承属性
Stella981 Stella981
3年前
JavaScript prototype原型用法
JavaScript对象原型所有JavaScript对象都从原型继承属性和方法。<!DOCTYPEhtml<html<metacharset"utf8"<titlejs</title<body<h2JavaScript对象</h2
Stella981 Stella981
3年前
JavaScript学习总结(十七)——Javascript原型链的原理
一、JavaScript原型链ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法。其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。在JavaScript中,用__proto__属性来表示一个对象的原型链。当查找一个对象的属性时,JavaScript会向上遍历原型
可莉 可莉
3年前
23.JavaScript原型和原型链
1.原型:prototype,所有的函数都有一个属性prototype,称之为函数原型默认情况下,prototype是一个普通的Object对象默认情况下,prototype中有一个属性constructor,它也是一个对象,它指向构造函数本身functionTest(){}Test.prototype:函数Test的原型Test.pr
Wesley13 Wesley13
3年前
JS函数高级
原型与原型链所有函数都有一个特别的属性:prototype:显式原型属性所有实例对象都有一个特别的属性:__proto__:隐式原型属性显式原型与隐式原型的关系函数的prototype:定义函数时被自动赋值,值默认为{},即用为原型对象
Wesley13 Wesley13
3年前
JS原型、原型链深入理解
原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有”prototype”属性,函数对象有”prototype”属性,原型对象有”constructor”属性。原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有”prototype”属性,函数对象有”prototype”属性,原型对
Stella981 Stella981
3年前
JavaScript 原型和原型链的定义和使用
目录JavaScript原型和原型链的定义和使用01原型原型定义原型实例理解书写方法1:属性单个定义书写方法2:属性多个定义02原型链原型链定义原型链实例理解最终原型问题03原型和原型链的使用应用举例Ja
Stella981 Stella981
3年前
JavaScript原型和原型链——构造函数
一、instanceof:判断引用类型(数组、对象、函数)的变量是由哪一个 构造函数派生出来的。(oinstanceofObject)二、原型规则和示例  1、所有的引用类型(数组、对象、函数),都具有对象特性,可以自由扩展属性(除了"null“以外)。  2、所有的引用类型(数组、对象、函数),都具有\_\_p
Stella981 Stella981
3年前
JavaScript 基于原型链的继承
JavaScript对象是动态的属性“包”(指其自己的属性)。JavaScript对象有一个指向一个原型对象的链。当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。遵循ECMAScript标准,someObject.Prototype
Wesley13 Wesley13
3年前
ES6面向对象
ES6面向对象js中的面向对象functionUser(name,age){this.namename;//定义属性this.ageage;}//通过原型添加方法User.prototype.showNamefuncti
Stella981 Stella981
3年前
Javascript 构造函数和类
1.构造函数构造函数的名称一般都是首字母大写挂载在this上面的属性为实例属性,实例属性再每个实例间都是独立的原型链属性通过prototype添加,他是所有实例共享的类方法/静态属性只能由构造函数本身访问当实例属性和原型链上的属性重名时,优先访问实例属性,没有实例属性再访问原型属性大多数浏览器的ES5实现之中,每一个对象都有\_\_pr
副业刚需
副业刚需
Lv1
春风又绿江南岸,明月何时照我还?
文章
3
粉丝
0
获赞
0