js中可以这样定义对象吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js中可以这样定义对象吗?相关的知识,希望对你有一定的参考价值。

就是将cat.prototype.showName放在函数体内。

function cat(color,name)

animal.apply(this,arguments);
this.color=color;
this.name=name;
cat.prototype.showName=function()
console.log("the name is"+this.name);



我以前碰到的写法都是
function cat(color,name)

animal.apply(this,arguments);
this.color=color;
this.name=name;

cat.prototype.showName=function()
console.log("the name is"+this.name);

可是今天碰到第一种写法竟然没有报错,不知道为什么,如果第一个写法没有什么问题,那么js中经典的动态原型写法不就是多此一举吗?
动态原型写法是:

<html>
<body>
<script type="text/javascript">
function Car(sColor,iDoors,iMpg)
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
this.drivers = new Array("Mike","John");

if (typeof Car._initialized == "undefined")
Car.prototype.showColor = function()
alert(this.color);
;
Car.prototype.showDoors = function()
alert(this.doors);
;
Car._initialized = true;


var oCar1 = new Car("red",4,23);
var oCar2 = new Car("blue",3,25);
oCar1.drivers.push("Bill");
document.write(oCar1.drivers);
document.write("<br />")
document.write(oCar2.showDoors());
</script>
</body>
</html>

当初就是为了将prototype内的东西写进函数体内,设计了动态原型写法。这不是和第一种写法一样了吗?第一种写法为什么没有出现错误呢?

js中定义对象的几种方式

  1. 基于已有对象扩充其对象和方法(只适合于临时的生成一个对象):
  var obj = new Object();
  obj.name="userObject";
  obj.printName = function(name)
  this.name = name;
  alert(this.name);
  
  obj.printName("newUserObject");
  2.工厂方式创建对象(每次创建一个object后,其中对应的方法(本例中是get)也被创建一次,方法不能被所创建的所有对象(本例中是obj1和obj2)共享):
  a.
  function createObject()
  var obj = new Object();
  obj.name="userObject";
  obj.password = "12345";
  obj.get = function()
  alert(this.name + ", " + this.password);
  
  return obj;
  
  var obj1 = createObject();
  var obj2 = createObject();
  obj1.get();
  obj2.get();
  b.带参数的构造方法:
  function createObject(username,password)
  var obj = new Object();
  obj.username = username;
  obj.password = password;
  obj.get = function()
  alert(this.username + ", " + this.password);
  
  return obj;
  
  var obj1 = createObject("zhangsan","123456");
  obj1.get();
  c.让函数被多个创建的对象所共享,而不是每一个对象都创建一个相同的函数(缺点:对象定义本身和方法分离了):
  function get()
  alert(this.username + ", " + this.password);
  
  function createObject(username,password)
  var obj = new Object();
  obj.username = username;
  obj.password = password;
  obj.get = get;
  return obj;
  
  var obj1 = createObject("zhangsan","123456");
  var obj2 = createObject("lisi","54321");
  obj1.get();
  obj2.get();
  3.构造函数方式:
  a.
  function Person()
  this.username = "zhangsan";
  this.password = "123";
  this.getInfo = function()
  alert(this.username + ", " + this.password);
  
  
  var person = new Person();
  person.getInfo();
  b.可以在构造函数是传递参数:
  function Person(username,password)
  this.username = username;
  this.password = password;
  this.getInfo = function()
  alert(this.username + ", " + this.password);
  
  
  var person = new Person("zhangsan","123");
  person.getInfo();
  4.使用原型(prototype)方式创建对象:
  优点:创建的多个对象共享同一个方法(getInfo)
  缺点:创建的多个对象在共享同一个方法的同时也共享了同样的属性(username,password),实际开发中这样儿是
  不行的,必须是多个对象都要有自己的属性。
  采用该方式创建对象通常是用来扩展已有对象的某一个方法。
  a.
  function Person()
  Person.prototype.username = "zhangsan";
  Person.prototype.password = "123";
  Person.prototype.getInfo = function()
  alert(this.username + ", " + this.password);
  
  var person = new Person();
  var person2 = new Person();
  person.username = "lisi";
  person.getInfo();
  person2.getInfo();
  b.如果使用原型方式创建对象,那么生成的所有对象将会共享原型中的属性,这样儿一个对象改变了该属性也会反应到其他的对象上:
  function Person()
  Person.prototype.username = new Array(0;
  Person.prototype.password = "123";
  Person.prototype.getInfo = function()
  alert(this.username + ", " + this.password);
  
  var person = new Person();
  var person2 = new Person();
  person.username.push("zhangsan");
  person.username.push("lisi");
  person.password = "456";
  person.getInfo();
  person2.getInfo();
  c.使用原型和构造函数方式来创建对象:
  function Person()
  this.username = new Array();
  this.password = "123"
  
  Person.prototype.getInfo = function()
  alert(this.username + ", " + this.password);
  
  var person = new Person();
  var person2 = new Person();
  person.username.push("zhangsan");
  person.username.push("lisi");
  person.getInfo();
  person2.getInfo();
  5.动态原型方式:在构造函数中通过标志量让所有对象共享一个方法,而每个对象拥有自己的属性。
  function Persion()
  this.username = "zhangsan";
  this.password = "123";
  if(typeof Person.flag == "undefined")
  Person.prototype.getInfo = function()
  alert(this.username + ", " + this.password);
  
  Person.flag = true;
  
  
  var p = new Person();
  var p2 = new Person();
  p.getInfo();
  p2.getInfo();
参考技术A cat.prototype.showName=function()
console.log("the name is"+this.name);

不会报错,但是你这么写,每次new cat()时就会调用一次,经典写法只会在解析时运行一次,高下立判。本回答被提问者采纳
参考技术B Version: '1.5.1' 和 Version= '1.5.1' 是一样的

这个来源于js的简化语法

<script>
alert('go');

arr=[1, 2, 3]; //数组可以写成这样
for(i=0; i<arr.length; i++)
alert(arr[i]);


clazz=a: 1, b: 2, c: 3, d:function(o)alert('hi '+o+',^-^') //对象可以写成这样
clazz.d('Molly');
</script>
参考技术C cat.prototype.showName=function()
console.log("the name is"+this.name);

将showName添加到原型里面了来自:求助得到的回答
参考技术C animal.apply(this,arguments);

我可以像D3.js一样使用JasperReports吗?

我可以使用像D3.js这样的JasperReports。 D3 js是一个用于生成用户交互式报告的JavasSript lib,例如用户可以在报告like 中使用特定区域。

JasperReports真的支持这些功能吗?

答案

目前Jasper Reports似乎不支持此功能,但您可以按照建议的here在自定义组件中实现D3支持。

以上是关于js中可以这样定义对象吗?的主要内容,如果未能解决你的问题,请参考以下文章

定义一个js函数,有三个参数,调用的时候,只传递前2个参数,这样可以吗?

为啥jQuery可以这样使用的$(id)不加双引号,

js window对象top能改写吗

我可以在 VBA 中使用我的 python 自定义对象吗?

C#中可以嵌入js编译器吗?这样我就好在.net中用js来写代码了

JS面向对象三大特征:封装、继承、多态