extend
Define a custom map type.
DefineMap.extend([name,] [static,] prototype)
Extends DefineMap, or constructor functions derived from DefineMap, to create a new constructor function.
import {DefineMap} from "can";
const Person = DefineMap.extend(
// Optional debugger name
"Person",
// Optional static properties.
{
// Seal instances of this type. This is the default.
seal: true
},
{
first: "string",
last: { type: "string" },
fullName: {
get: function() {
return this.first + " " + this.last;
}
},
age: { default: 0 }
}
);
const me = new Person( { first: "Justin", last: "Meyer" } );
console.log( me.fullName ); //-> "Justin Meyer"
console.log( me.age ); //-> 0
Parameters
- name
{String}
:Provides an optional name for this type that will show up nicely in debuggers.
- static
{Object}
:Static properties that are set directly on the constructor function.
- prototype
{PropDefinition}
:A definition of the properties or methods on this type. See PropDefinition for all available property definitions.
Use
If the property definition is a plain function, it's considered a method.
import {DefineMap} from "can";
const Person = DefineMap.extend( {
sayHi: function() {
console.log( "hi" );
}
} );
const me = new Person();
me.sayHi(); //-> "hi"
If the property definition is a string, it's considered a type
setting to be looked up in can-define.types.
import {DefineMap, DefineList} from "can";
const Person = DefineMap.extend( {
age: "number",
isCool: "boolean",
hobbies: "observable"
} );
const me = new Person( { age: "33", isCool: "false", hobbies: [ "js", "bball" ] } );
console.log( me.age ); //-> 33
console.log( me.isCool ); //-> false
console.log( me.hobbies instanceof DefineList ); //-> true
If the property definition is a Constructor function, it's considered a Type
setting.
import {DefineMap} from "can";
const Address = DefineMap.extend( {
zip: "number"
} );
const Person = DefineMap.extend( {
address: Address
} );
const me = new Person( { address: { zip: "60048" } } );
console.log( me.address.zip ); //-> 60048
If the property is an object, it's considered to be a PropDefinition.
import {DefineMap} from "can";
const Person = DefineMap.extend( {
fullName: {
get: function() {
return this.first + " " + this.last;
},
set: function( newVal ) {
const parts = newVal.split( " " );
this.first = parts[ 0 ];
this.last = parts[ 1 ];
}
},
// slick way of creating an 'inline' type.
address: {
Type: {
zip: "number"
}
}
} );
const me = new Person( { fullName: "Rami Myer", address: { zip: "60048" } } );
console.log( me.first ); //-> "Rami"
console.log( me.address.zip ); //-> 60048