JavaScript原型prototype

2024-04-28 19:18
文章标签 java script prototype 原型

本文主要是介绍JavaScript原型prototype,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

prototype

听说prototype是JavaScript中最难的部分,最近学习了相关知识,感觉确实挺复杂,主要是比较难理解。为了避免遗忘,将最近的学习做一个简单的总结。
prototype类似java中的静态方法和静态变量。可以实现共享。对象中的proto指针指向prototype,prototype保存着该类的“静态属性和方法和constructor”。constructor 可以获取构造函数本身。
构造函数中的方法分为实例方法和原型方法,构造函数中定义的方法是实例方法。prototype指向的方法是原型方法。

//定义原型方法和原型属性function Person(){}Person.prototype.height = 180;Person.prototype.sex = "man";Person.prototype.fun = function (){return this.height+this.sex;};

直接输出constructor会输出构造函数的函数体。

    alert(tom.__proto__.constructor);

使用时的执行流程: 现在实例对象中找,如果找不到再到原型对象中找。(访问–>实例对象–>原型对象)
删除原型属性:

delete Person.prototype.name;

isPrototypeOf()

判断一个属性是否指向自己的原型
Box.prototype.isPrototypeOf(属性);

    var tom = new Person();var jerry = new Person();var obj = new Object();var flag = Person.prototype.isPrototypeOf(tom);  // truevar flag = Person.prototype.isPrototypeOf(obj);  // truevar flag = Object.prototype.isPrototypeOf(tom);  // false

因此,所有对象都指向Object的原型。如果改变object对象指向的原型,就改变了所有对象的原型。但是原型是单向的,所有对象都指向Object,但是Object不会指向其他对象

            Object.prototype.name = "zhangsan";

hasOwnProperty(属性名) // ???

判断是否存在指定的实例属性。

in

查找实例和原型中的属性,只要存在就返回
属性名 in 对象名

只判断原型中的属性(自定义函数)

hasOwnProperty返回false && in返回true 时满足要求

封装

对象的属性分为实例属性和原型属性,为了将类封装成一个整体,可以把原型属性写在构造函数内,但是这种方式每次创建对象时都会创建原型属性,比较浪费资源:

        function Fun(name , age){this.name = name ;this.age = age;Fun.prototype.run = function (){return this.name+this.age+"#";};}

可以采取这种优化的方法,判断原型对象是否被创建过,只在第一次使用时创建原型属性:

        function Fun2(name , age){this.name = name ;this.age = age;if(typeof Fun2.prototype.run != 'function'){  alert("#");Fun2.prototype.run = function(){return this.name + this.age+"#";}}}

继承

原型链继承

被继承叫做超类型,继承的函数叫做子类型,继承的对象可以使用父类的实例和原型属性。
所有对象都是继承自Object对象

    // 继承function A(){this.name = "a";this.age = 20;}A.prototype.name = "prototype_a";   // 原型属性function B(){this.name = "b";}B.prototype = new A();              // 使 B 继承 Avar obj = new B();alert(obj.age);     // 20alert(obj.name);    // b 本地属性覆盖父类属性

对象冒充

对象冒充无法继承父类的prototype属性,只能冒充构造函数中的信息。冒充的对象类型不变

    function C(name){this.name = name;this.age = 100;this.sss = new Array(1,2,3,4,5);}C.prototype.family = "family";function D(name ,age ){C.call(this,name);}var d = new D("zhangsan",20);alert(d.name);          //zhangsanalert(d.age);           //100alert(d.family);        //1,2,3,4,5alert(d instanceof D);  //true

组合模式

在冒充的基础上使用继承,这样就可以继承原型方法

    function E(name){this.name = name;this.sss = [1,2,3,4,5];}E.prototype.family = "prototype_family";function F(name , age){E.apply(this,[name]);}F.prototype = new E();var f = new F("lisi",40);alert(f.family);            // 1,2,3,4,5

原型式继承

对象时采用引用的关系。

    // 原型式继承function G(obj){var Temp = function (){}Temp.prototype = obj;return new Temp();}var data = {name:"zhangsanG",age:20,family:[1,2,3,4,5]};var g = new G(data);g.family.push(6);alert(data.family); //1,2,3,4,5,6var gg = new G(data);alert(gg.family);   // 1,2,3,4,5,6

这篇关于JavaScript原型prototype的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/944039

相关文章

Java注解解析以及自定义注解

Java中常见的注解 @Override 覆盖父类的方法@Deprecated 方法已过时@SuppressWarnings("deprecation") 忽略Deprecated警告 注解按照运行机制划分 源码注解:注解只在源码中存在,编译成.class文件就不存在了;编译时注解:注解在源码和.class文件中都存在(如:@Override、@Deprecated、@Suppres

Java编程思想阅读笔记(第11章持有对象)

Java容器类类库的用途是“保存对象”并将其分为两个不同的概念 Collection。 一个独立元素的序列,这些元素服从一条或多条规则,List必须按照插入的顺序保存,而set不能有重复元素,Queue按照排队规则来确定对象产生的顺序(通常与它们插入的顺序相同)Map。一组成对的”键值对“对象,允许使用键查找。 浅谈Arrays.asList()方法的使用  首先,该方法是将数组转化为lis

Java编程思想阅读笔记(第10章内部类)

内部类 内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的可以将一个类的定义放在另一个类定义内部,这就是内部类内部类自动拥有对包裹它的基类所有成员的访问权限内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)内部类主要有以下几类:成员内部类、局部内部类、静态内部类、匿名内部类 内部类的共性 内

Java编程思想阅读笔记(第九章接口)

抽象 - 包含抽象方法的类叫做抽象类,一个类中有一个或多个抽象方法,则这个类必须被指定为抽象类- 抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理- 子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。);- 抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类; - 抽象类中

spring集成redisson实现分布式锁

在单进程的系统中,当存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步,使其在修改这种变量时能够线性执行消除并发修改变量。而Java提供的同步锁synchronized只能解决单台服务器上的并发问题,一般线上环境都是多台服务器部署同时运行,跨jvm的环境下synchronized的作用就不大了。这个时候redis就可以作为分布锁来使用了,一般都是基于redis setN

Java随笔1

1.编程中组件的概念: 在编程中,组件(Component)通常指的是一种可重用的、模块化的代码单元,它封装了特定的功能或用户界面元素,并提供了与其他代码进行交互的接口。组件可以看作是对数据和方法的简单封装,具有自己的属性和方法。属性是组件数据的简单访问者,而方法则是组件的一些简单而可见的功能。 在不同的编程语言和框架中,组件的具体实现方式可能有所不同。例如,在C++ Builder中,一个

JAVA核心技术36讲笔记

快速访问地址 https://github.com/a870439570/interview-docs 文章目录 谈谈你对Java平台的理解?“Java是解释执行”,这句话正确吗?Exception和Error有什么区别?谈fnal、fnally、 fnalize有什么不同?强引用、软引用、弱引用、幻象引用有什么区别?String、StringBufer、StringBuilder有

SpringBoot集成prometheus+Grafana监控

概述 Prometheus是一个最初在SoundCloud上构建的开源系统监视和警报工具包 。 添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--prometheus监控 h

JavaScript 动态网页实例 —— 文字色彩与形状

首先介绍霓虹灯文字效果的设计,介绍文字色彩的静态渐变,然后介绍两个文字大小不断变化的示例,最后,则是两段文字色彩动态变化的代码。本章实例针对性较强,稍加修改就可以应用在网页中。读者不必拘泥于实例的效果,而应更重视实现这些效果的方法,相信这些实例能对开阔思路有一定的帮助。 霓虹灯文字 本节给出一段实现霓虹灯效果文字的示例代码,页面中的文字自左至右逐个先变红再变蓝,给人霓虹灯的感觉

Springboot整合向量数据库Milvus

Springboot整合向量数据库Milvus 导入依赖 <!--milvus 向量数据库 client sdk --><dependency><groupId>io.milvus</groupId><artifactId>milvus-sdk-java</artifactId